diff --git a/devel/opencm/Makefile b/devel/opencm/Makefile index 15e4dc8f644..e7f691c3bf7 100644 --- a/devel/opencm/Makefile +++ b/devel/opencm/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.2 2002/08/28 14:38:25 todd Exp $ +# $OpenBSD: Makefile,v 1.3 2002/08/28 22:23:29 todd Exp $ COMMENT= "OpenCM change management system" COMMENT-docs= "OpenCM Documentation" @@ -7,7 +7,7 @@ V= 0.1.0alpha16 sV= -1 DISTNAME= opencm-${V}${sV}-src PKGNAME= opencm-${V} -FULLPKGNAME= opencm-${V} +FULLPKGNAME= opencm-${V}p1 FULLPKGNAME-docs= opencm-docs-${V} CATEGORIES= devel diff --git a/devel/opencm/patches/patch-base_etc_opencm_rc b/devel/opencm/patches/patch-base_etc_opencm_rc new file mode 100644 index 00000000000..e9e5b023c2b --- /dev/null +++ b/devel/opencm/patches/patch-base_etc_opencm_rc @@ -0,0 +1,30 @@ +$OpenBSD: patch-base_etc_opencm_rc,v 1.1 2002/08/28 22:23:29 todd Exp $ +--- base/etc/opencm.rc.orig Mon Jul 8 16:29:08 2002 ++++ base/etc/opencm.rc Wed Aug 28 14:26:39 2002 +@@ -68,7 +68,7 @@ then + fi + + # Make sure the binary is there +-if [ ! -x /usr/bin/opencm ] ++if [ ! -x /usr/bin/cm ] + then + exit 0 + fi +@@ -89,7 +89,7 @@ prog="opencm" + + start() { + echo -n $"Starting $prog: " +- daemon --user opencm --notify "${OPENCM_NOTIFY}" opencm server "${OPENCM_REPOSITORY}" ++ daemon --user opencm cm --notify "${OPENCM_NOTIFY}" server "${OPENCM_REPOSITORY}" + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/opencm +@@ -98,7 +98,7 @@ start() { + + stop() { + echo -n $"Stopping $prog: " +- killproc opencm ++ killproc cm + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/opencm diff --git a/devel/opencm/patches/patch-base_src_client_Merge_c b/devel/opencm/patches/patch-base_src_client_Merge_c new file mode 100644 index 00000000000..7bffb71fede --- /dev/null +++ b/devel/opencm/patches/patch-base_src_client_Merge_c @@ -0,0 +1,61 @@ +$OpenBSD: patch-base_src_client_Merge_c,v 1.1 2002/08/28 22:23:29 todd Exp $ +--- base/src/client/Merge.c.orig Mon Aug 5 21:38:03 2002 ++++ base/src/client/Merge.c Wed Aug 28 14:26:39 2002 +@@ -1208,6 +1208,10 @@ static void + check_name_collisions(ObVec *tuples, StrVec *names) + { + unsigned u = 0; ++ OC_bool collisions = FALSE; /* until proven otherwise */ ++ ++ /* Make sure names is sorted, since we use bsearch... */ ++ strvec_sort(names); + + /* Make a simulated deletion pass of the fsnames that are either + going to disappear entirely (due to being deleted or renamed) or +@@ -1226,9 +1230,6 @@ check_name_collisions(ObVec *tuples, Str + continue; + + assert(mt->result); +- +- /* ws_Enumerate returns a sorted vector, so we can use bsearch() +- here: */ + assert(mt->ws->cur_fsName); + assert(mt->finalName); + { +@@ -1251,12 +1252,18 @@ check_name_collisions(ObVec *tuples, Str + assert(mt->result); + assert(mt->finalName); + +- if (strvec_bsearch(names, mt->finalName) >= 0) +- THROW(ExObjectExists, +- format("Merge/Update would clobber \"%s\"" +- " -- move it out of the way.", +- mt->finalName)); ++ if (strvec_bsearch(names, mt->finalName) >= 0) { ++ collisions = TRUE; ++ report(0,"Merge/Update would clobber \"%s\"" ++ " -- move it out of the way.\n", mt->finalName); ++ } + } ++ ++ /* Wait until all collisions are reported before throwing the ++ exception. This allows the user to resolve all of them at ++ once. */ ++ if (collisions) ++ THROW(ExObjectExists, "Merge/Update name collisions!"); + } + + static void +@@ -1535,7 +1542,11 @@ ws_mergeFrom(WorkSpace *ws, Repository * + have to do this after executing the merge plan, because the + 'merge' or 'update' command may add new files to the Workspace + and/or may rename current Workspace files. */ +- names = ws_Enumerate(ws, WSE_UNFILTERED, 0); /* get EVERYTHING */ ++ names = strvec_create(); ++ ++ /* Enumerate the filesystem space, getting everything. Then do a ++ name collision check against that list. */ ++ ws_EnumeratePath(ws, names, path_curdir(), WSE_UNFILTERED, 0); + check_name_collisions(tuples, names); + + report(1, "No name collisions\n" diff --git a/devel/opencm/patches/patch-base_src_client_WorkSpace_c b/devel/opencm/patches/patch-base_src_client_WorkSpace_c new file mode 100644 index 00000000000..05cb3b72cc4 --- /dev/null +++ b/devel/opencm/patches/patch-base_src_client_WorkSpace_c @@ -0,0 +1,290 @@ +$OpenBSD: patch-base_src_client_WorkSpace_c,v 1.1 2002/08/28 22:23:29 todd Exp $ +--- base/src/client/WorkSpace.c.orig Mon Aug 5 20:07:37 2002 ++++ base/src/client/WorkSpace.c Wed Aug 28 14:26:39 2002 +@@ -193,7 +193,6 @@ ws_Init(struct command *cmd, const char + */ + + WorkSpace *ws = GC_MALLOC(sizeof(WorkSpace)); +- SER_MODIFIED(ws); + + /* Eventually we will support layered projects, and it will be + possible for rootPath to be non-null. Until then, just barf if +@@ -248,8 +247,6 @@ ws_Init(struct command *cmd, const char + void + ws_Connect(WorkSpace *ws, PubKey *pk) + { +- SER_MODIFIED(ws); +- + if (ws->r == NULL) + THROW(ExNoConnect, "No repository specified in Workspace."); + +@@ -270,7 +267,7 @@ ws_Connect(WorkSpace *ws, PubKey *pk) + void + ws_RewriteWorkspace(WorkSpace *ws) + { +- SER_MODIFIED(ws); ++ SER_MODIFIED(ws->pc); + + if (ws->projPath == 0) { + const char *scratchPath; +@@ -322,19 +319,31 @@ ws_AddFile(WorkSpace *ws, const char *fn + WsEntity *wse = pendingchange_FindEntity(ws->pc,fnm); + + if (wse) { +- /* First, complain (rather aggressively) if user is trying to +- cancel a file that was deleted by a 'merge' operation. */ +- if ((wse->flags & NEF_MERGED) && (wse->flags & NEF_DELETED)) +- THROW(ExBadValue, +- format("File \"%s\"was just merged and I can't let you " +- "partially undo a merge. Use \"%s revert\" to " +- "undo the merge first.", fnm, path_tail(appInvokedName))); ++ /* If NEF_JADD and NEF_DELETED, then change it back to just NEF_JADD */ ++ if ((wse->flags & NEF_JADD) && (wse->flags & NEF_DELETED)) { ++ wse->flags &= ~ NEF_DELETED; ++ SER_MODIFIED(wse); ++ } + +- else if (wse->flags & NEF_DELETED) +- wse->flags &= ~ NEF_DELETED; /* cancel a previous 'rm' */ +- else if (wse->flags & NEF_CONDDEL) ++ /* If NEF_MERGED and NEF_DELETED, then just override the deletion ++ of this Entity: */ ++ else if ((wse->flags & NEF_MERGED) && (wse->flags & NEF_DELETED)) { ++ wse->flags &= ~ (NEF_MERGED | NEF_DELETED); ++ SER_MODIFIED(wse); ++ } ++ ++ /* If just NEF_DELETED, cancel that: */ ++ else if (wse->flags & NEF_DELETED) { ++ wse->flags &= ~ NEF_DELETED; ++ SER_MODIFIED(wse); ++ } ++ ++ /* If just NEF_CONDDEL, cancel that: */ ++ else if (wse->flags & NEF_CONDDEL) { + wse->flags &= ~ NEF_CONDDEL; /* cancel a previous CONDDEL set by + 'merge' */ ++ SER_MODIFIED(wse); ++ } + /* If the object is already in the workspace, silently ignore. + This is needed because ws_EnumeratePath is promiscuous. */ + } +@@ -356,47 +365,32 @@ ws_AddFile(WorkSpace *ws, const char *fn + return wse; + } + +-#if 0 +-WsEntity * +-ws_AddFile(WorkSpace *ws, const char *fnm) +-{ +- WsEntity *wse = wsentity_addFromFile(ws->pc, fnm, opt_eType); +- +- pendingchange_InsertEntity(ws->pc, wse); +- +- SER_MODIFIED(wse); +- +- return wse; +-} +-#endif +- + void + ws_RemoveFile(WorkSpace *ws, const char *fnm) + { + WsEntity *wse = pendingchange_FindEntity(ws->pc,fnm); + + if (wse) { +- /* First, complain (rather aggressively) if user is trying to remove +- a file that was either added or touched by a 'merge' +- operation. */ +- if (wse->flags & NEF_JADD || +- (wse->flags & NEF_MERGED && (wse->flags & NEF_DELETED) == 0)) +- THROW(ExBadValue, +- format("File \"%s\" was just merged and I can't let you " +- "partially undo a merge. Use \"%s revert\" to " +- "undo the merge first.", fnm, path_tail(appInvokedName))); +- ++ /* If this is a mergespace orphan that was just added to the ++ Workspace from 'merge', (NEF_MERGED and NEF_JADD) change its ++ state to (NEF_MERGED | NEF_JADD | NEF_DELETED). This allows ++ user to be wishy-washy and change this entity back to ++ (NEF_MERGED | NEF_JADD) if he wants. */ ++ if (wse->flags & NEF_JADD && wse->flags & NEF_MERGED) { ++ wse->flags |= NEF_DELETED; ++ wsentity_ReportStatus(wse); ++ SER_MODIFIED(wse); ++ } + /* If WsEntity is marked NEF_ADDED, remove it from PendingChange, +- but leave the actual file in place. This will result in that +- file becoming "unknown" to the 'status' command. */ +- if (wse->flags & NEF_ADDED) { ++ but leave the actual file in place. This will result in that ++ file becoming "unknown" to the 'status' command. */ ++ else if (wse->flags & NEF_ADDED) { + pendingchange_RemoveEntity(ws->pc, wse); + xprintf("%s %10d %s\n", + "[ forget ]", + wse->lk_length, + wse->cur_fsName); + SER_MODIFIED(ws->pc); +- SER_MODIFIED(ws); + } + else if (wse->flags & NEF_DELETED) + report(0, "File is already marked for deletion.\n"); +@@ -410,6 +404,7 @@ ws_RemoveFile(WorkSpace *ws, const char + wse->flags |= NEF_DELETED; + + SER_MODIFIED(wse); ++ wsentity_ReportStatus(wse); + } + } + else +@@ -507,7 +502,8 @@ ws_EnumeratePath(WorkSpace *ws, + { + /* Make sure 'path' is relative to the Workspace top dir, since + that's how everything is processed */ +- path = ws_NormalizePath(ws, path); ++ if (flags & WSE_NORMALIZE) ++ path = ws_NormalizePath(ws, path); + + /* If we are asked on the command line to enumerate a file, we need + to apply the user-supplied filter in all cases. */ +@@ -523,12 +519,32 @@ ws_EnumeratePath(WorkSpace *ws, + } + + StrVec * +-ws_Enumerate(WorkSpace *ws, unsigned flags, OC_bool (*filter)(WorkSpace *, const char *)) ++ws_EnumerateWsEnts(WorkSpace *ws, StrVec *regexpVec) + { ++ unsigned u, j; + StrVec *names = strvec_create(); +- +- ws_EnumeratePath(ws, names, path_curdir(), flags, filter); + ++ if (regexpVec) strvec_sort(regexpVec); ++ ++ for (u = 0; u < vec_size(ws->pc->entSet); u++) { ++ WsEntity *wse = (WsEntity *) vec_fetch(ws->pc->entSet, u); ++ ++ if (regexpVec == NULL || strvec_bsearch(regexpVec, wse->cur_fsName) >= 0) { ++ strvec_append(names, wse->cur_fsName); ++ continue; ++ } ++ ++ /* In some cases, "names" can contain a glob expression, such as ++ the name of a subdir (which may or may not exist). Here's ++ where we handle that. */ ++ for (j = 0; j < vec_size(regexpVec); j++) { ++ const char *glob_expr = vec_fetch(regexpVec, j); ++ ++ if (glob_match(wse->cur_fsName, glob_expr, GM_FS_COMPONENT)) ++ strvec_append(names, wse->cur_fsName); ++ } ++ } ++ + strvec_sort(names); + + return names; +@@ -539,9 +555,11 @@ ws_PruneWorkspace(WorkSpace *ws) + { + /* Grab an unfiltered list of directories: */ + +- StrVec *s = ws_Enumerate(ws, WSE_DIRS, 0); ++ StrVec *s = strvec_create(); + unsigned u; + ++ ws_EnumeratePath(ws, s, path_curdir(), WSE_DIRS, 0); ++ + strvec_sort(s); + + /* This is sleazy. We simply rely on the fact that rmdir() fails +@@ -573,7 +591,7 @@ ws_BuildPendingChange(WorkSpace *ws, + oc_uint64_t nRevs) + { + ws->pc = pendingchange_create(r, branchURI, nRevs); +- SER_MODIFIED(ws); ++ SER_MODIFIED(ws->pc); + } + + static int +@@ -655,7 +673,6 @@ ws_RestoreFiles(WorkSpace *ws, unsigned + went->lk_modTime = 0; /* force modify recomputation */ + SER_MODIFIED(went); + SER_MODIFIED(ws->pc); +- SER_MODIFIED(ws); + } + } + +@@ -720,14 +737,13 @@ ws_Revert(WorkSpace *ws) + oc_uint64_t nRevs = ws->pc->nRevisions; + + ws->pc = pendingchange_create(ws->r, branchURI, nRevs); +- SER_MODIFIED(ws); ++ SER_MODIFIED(ws->pc); + } + + ws_RestoreFiles(ws, WSR_CHECKCOLLIDE|WSR_FORCE); + + ws->pc->mergedChange = 0; + SER_MODIFIED(ws->pc); +- SER_MODIFIED(ws); + } + + void +@@ -735,7 +751,12 @@ ws_Populate(WorkSpace *ws) + { + unsigned i; + +- StrVec *names = ws_Enumerate(ws, WSE_NORMAL, 0); ++ StrVec *names = strvec_create(); ++ ++ ws_EnumeratePath(ws, names, path_curdir(), ++ WSE_FILES | WSE_FILTER, /* don't normalize and NO ++ symlinks! */ ++ 0); + + for (i = 0; i < vec_size(names); i++) { + const char *relpath = vec_fetch(names,i); +@@ -750,7 +771,7 @@ ws_Populate(WorkSpace *ws) + } + } + +- SER_MODIFIED(ws); ++ SER_MODIFIED(ws->pc); + } + + static OC_bool +@@ -843,7 +864,8 @@ ws_Rename(WorkSpace *ws, const char *old + non-OpenCM files as well as workspace entities, and it's quite + astonishing how many ways there are for these to collide. */ + +- fsvec = ws_Enumerate(ws, WSE_FILES|WSE_SYMLINKS, 0); ++ fsvec = strvec_create(); ++ ws_EnumeratePath(ws, fsvec, path_curdir(), WSE_FILES|WSE_SYMLINKS, 0); + strvec_sort(fsvec); + + /* First, go through the OpenCM workspace entries: */ +@@ -1034,7 +1056,7 @@ ws_Commit(WorkSpace *ws, StrVec *names) + */ + + pendingchange_addNote(ws->pc, opt_Message); +- SER_MODIFIED(ws); ++ SER_MODIFIED(ws->pc); + + /* Smash opt_Message to point to the result of the combination in + * order to preserve the silent commit behavior: +@@ -1232,7 +1254,6 @@ ws_Commit(WorkSpace *ws, StrVec *names) + ws->pc->isSorted = FALSE; + + SER_MODIFIED(ws->pc); +- SER_MODIFIED(ws); /* FIX: ws isn't a Serializable. ??? */ + } + + void +@@ -1278,7 +1299,6 @@ ws_Update(WorkSpace *ws) + ws->pc->baseCmtInfoName = topChange->commitInfoTrueName; + + SER_MODIFIED(ws->pc); +- SER_MODIFIED(ws); + } + + void diff --git a/devel/opencm/patches/patch-base_src_client_WorkSpace_h b/devel/opencm/patches/patch-base_src_client_WorkSpace_h new file mode 100644 index 00000000000..2d1b4d05ca5 --- /dev/null +++ b/devel/opencm/patches/patch-base_src_client_WorkSpace_h @@ -0,0 +1,36 @@ +$OpenBSD: patch-base_src_client_WorkSpace_h,v 1.1 2002/08/28 22:23:29 todd Exp $ +--- base/src/client/WorkSpace.h.orig Mon Aug 5 20:07:37 2002 ++++ base/src/client/WorkSpace.h Wed Aug 28 14:26:39 2002 +@@ -76,19 +76,25 @@ void ws_Revert(WorkSpace *); + + void ws_RestoreFiles(WorkSpace *, unsigned flags); + +-#define WSE_FILTER 0x1u +-#define WSE_FILES 0x2u +-#define WSE_DIRS 0x4u +-#define WSE_SYMLINKS 0x8u ++#define WSE_FILTER 0x1u /* Apply directory-level filters */ ++#define WSE_FILES 0x2u /* Looking for files only */ ++#define WSE_DIRS 0x4u /* Include subdirs */ ++#define WSE_SYMLINKS 0x8u /* Include symbolic links */ ++#define WSE_NORMALIZE 0x10u /* Make path relative to ws top dir */ + +-#define WSE_NORMAL (WSE_FILES|WSE_SYMLINKS|WSE_FILTER) +-#define WSE_UNFILTERED (WSE_FILES|WSE_SYMLINKS) ++#define WSE_STANDARD (WSE_FILES|WSE_FILTER|WSE_NORMALIZE) ++#define WSE_UNFILTERED (WSE_FILES|WSE_DIRS|WSE_SYMLINKS) + ++/* Used to enumerate actual files, as opposed to WsEntity objects. */ + void ws_EnumeratePath(WorkSpace *, StrVec *names, const char *path, + unsigned flags, + OC_bool (*filter)(WorkSpace *, const char *)); + +-StrVec *ws_Enumerate(WorkSpace *, unsigned flags, OC_bool (*fn)(WorkSpace *, const char *)); ++/* Used to enumerate the WsEntity objects, as opposed to actual ++ files. The 'regexpVec' argument is a list of regular expressions ++ against which to filter the WsEntities (based on their ++ cur_fsName). */ ++StrVec *ws_EnumerateWsEnts(WorkSpace *, StrVec *regexpVec); + + void ws_Commit(WorkSpace *ws, StrVec *names); + void ws_Update(WorkSpace *ws); diff --git a/devel/opencm/patches/patch-base_src_client_WsEntity_c b/devel/opencm/patches/patch-base_src_client_WsEntity_c new file mode 100644 index 00000000000..c6579489124 --- /dev/null +++ b/devel/opencm/patches/patch-base_src_client_WsEntity_c @@ -0,0 +1,53 @@ +$OpenBSD: patch-base_src_client_WsEntity_c,v 1.1 2002/08/28 22:23:29 todd Exp $ +--- base/src/client/WsEntity.c.orig Mon Aug 5 20:06:46 2002 ++++ base/src/client/WsEntity.c Wed Aug 28 14:26:39 2002 +@@ -246,7 +246,6 @@ wsentity_fromEntity(const Entity *e) + static const char * + wsentity_status(WsEntity *wse) + { +- /* FIX: Report change in executable status too */ + if (wse->flags == 0) + return "[same ]"; + else if (wse->flags & NEF_MISSING) +@@ -273,11 +272,11 @@ wsentity_ReportStatus(WsEntity *wse_u) + wse_u->cur_fsName); + + /* Display old name */ +- if (wse_u->flags & NEF_RENAMED) ++ if ((wse_u->flags & NEF_RENAMED) && opt_Verbosity >= 1) + report(0, " Name was: \"%s\"\n", wse_u->old->fsName); + + /* Display status of executable bit */ +- if (wse_u->flags & NEF_PERMS) { ++ if ((wse_u->flags & NEF_PERMS) && opt_Verbosity >= 1) { + if (wse_u->cur_entityPerms & EPRM_EXEC) + xprintf(" File is executable.\n"); + else +@@ -420,9 +419,8 @@ wsentity_RecomputeStatus(WsEntity *wse) + } + } + +- /* If NEF_JADD, definitely can't be NEF_DELETED and can't be NEF_ADDED*/ ++ /* If NEF_JADD, definitely can't be NEF_ADDED*/ + if (wse->flags & NEF_JADD) { +- assert( (wse->flags & NEF_DELETED) == 0 ); + assert( (wse->flags & NEF_ADDED) == 0 ); + } + +@@ -444,7 +442,6 @@ wsentity_RecomputeStatus(WsEntity *wse) + /* NOTE: We continue to track modification on deleted things. */ + if (wse->flags & NEF_DELETED) { + assert( (wse->flags & NEF_ADDED) == 0 ); +- assert( (wse->flags & NEF_JADD) == 0 ); + } + + #if 0 +@@ -531,8 +528,6 @@ wsentity_UploadTo(WsEntity *wse, + + assert(nmequal(wse->lk_contentTrueName, wse->old->contentTrueName)); + assert(wse->lk_length == wse->old->length); +- +- /* FIX: update the predecessor stuff here */ + + return 0; + } diff --git a/devel/opencm/patches/patch-base_src_client_WsEntity_h b/devel/opencm/patches/patch-base_src_client_WsEntity_h deleted file mode 100644 index 348446905ab..00000000000 --- a/devel/opencm/patches/patch-base_src_client_WsEntity_h +++ /dev/null @@ -1,21 +0,0 @@ -$OpenBSD: patch-base_src_client_WsEntity_h,v 1.1 2002/08/27 17:43:14 todd Exp $ ---- base/src/client/WsEntity.h.orig Mon Aug 5 20:06:46 2002 -+++ base/src/client/WsEntity.h Tue Aug 27 12:25:26 2002 -@@ -181,7 +181,7 @@ struct WsEntity { - unsigned flags; - const char *cur_fsName; - unsigned char cur_entityType; -- unsigned long cur_entityPerms; -+ u_int32_t cur_entityPerms; - const char *cur_mergeParent; - const char *cur_mergeParentChange; - -@@ -190,7 +190,7 @@ struct WsEntity { - believe them unless you have recently recomputed them via - wsentity_RecomputeStatus(). */ - const char *lk_contentTrueName; -- unsigned long lk_length; -+ u_int32_t lk_length; - - /* Last known modification time. This is used to avoid running the - expensive SHA-1 check in wsentity_RecomputeStatus(). If the mod diff --git a/devel/opencm/patches/patch-base_src_client_browse_Browse_c b/devel/opencm/patches/patch-base_src_client_browse_Browse_c index 3aa710adb65..6e839f09981 100644 --- a/devel/opencm/patches/patch-base_src_client_browse_Browse_c +++ b/devel/opencm/patches/patch-base_src_client_browse_Browse_c @@ -1,12 +1,180 @@ -$OpenBSD: patch-base_src_client_browse_Browse_c,v 1.1 2002/08/27 17:43:14 todd Exp $ +$OpenBSD: patch-base_src_client_browse_Browse_c,v 1.2 2002/08/28 22:23:29 todd Exp $ --- base/src/client/browse/Browse.c.orig Mon Jul 22 02:02:51 2002 -+++ base/src/client/browse/Browse.c Tue Aug 27 12:25:26 2002 -@@ -101,7 +101,7 @@ uri_encode(const char *s) - *to++ = *from; - } - else { -- unsigned long c = ((unsigned)*from) & 0xffu; -+ u_int32_t c = ((unsigned)*from) & 0xffu; ++++ base/src/client/browse/Browse.c Wed Aug 28 14:26:40 2002 +@@ -276,6 +276,11 @@ show_files(SDR_stream *out, Repository * + + for (w = 0; w < vec_size(ev); w++) { + const FileEntry *fe = vec_fetch(ev, w); ++ const char *email = fe->u ? pubkey_GetEmail(fe->u->pubKey) : "??"; ++ const char *author = email; ++ if (fe->u) ++ author = format(LINK("/opencm/everyone/%s", CONTENT("%s")), ++ email, email); + + if (last && strcmp(fe->name, last) == 0) + continue; +@@ -292,8 +297,7 @@ show_files(SDR_stream *out, Repository * + stream_printf(out, "" "%c" "", fe->isDir ? ' ' : fe->e->entityType); + stream_printf(out, "" "%s" "", + fe->ci ? xlate_time(fe->ci->time) : ""); +- stream_printf(out, "" "%s" "", +- fe->u ? pubkey_GetEmail(fe->u->pubKey) : "??"); ++ stream_printf(out, "" "%s" "", author); + + stream_printf(out, ""); + } +@@ -303,6 +307,19 @@ show_files(SDR_stream *out, Repository * + + } + ++static const char * ++page_header(const char *title) ++{ ++ return format("%s" ++ "" ++ "\n"); ++} ++ + static void + show_html(SDR_stream *out, Repository *repos, Resolution *res, + const char *thisPageURI) +@@ -318,7 +335,7 @@ show_html(SDR_stream *out, Repository *r + User *u = (User *) res->tail; + const char *u_s = u ? pubkey_GetEmail(u->pubKey) : "??"; + +- stream_printf(out, "User %s\n", u_s); ++ stream_printf(out, page_header(format("User %s", u_s))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "User
%s\n", u_s); +@@ -431,7 +448,7 @@ show_html(SDR_stream *out, Repository *r + Directory *dir = (Directory *) res->tail; + unsigned u; + +- stream_printf(out, "Directory %s\n", decodedURI); ++ stream_printf(out, page_header(format("Directory %s", decodedURI))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "Directory %s
", decodedURI); +@@ -473,7 +490,7 @@ show_html(SDR_stream *out, Repository *r + + stream_printf(out, ""); + +- stream_printf(out, "%s%s", ++ stream_printf(out, "%s%s", + (m && (m->flags & MF_FROZEN)) ? "F" : "", + (m && (m->flags & MF_NOTRAIL)) ? "N" : ""); + +@@ -481,11 +498,15 @@ show_html(SDR_stream *out, Repository *r + thisPageURI, + uri_encode(de->key), de->key); + if (s) { +- stream_printf(out, "%s", xunsigned64_str(m->nRevisions)); +- stream_printf(out, "%s", s->ser_type->tyName); +- stream_printf(out, "%s", xlate_time(rev->reviseTime)); +- stream_printf(out, "%s", +- u ? pubkey_GetEmail(u->pubKey) : "???"); ++ const char *email = u ? pubkey_GetEmail(u->pubKey) : "???"; ++ const char *author = email; ++ if (u) ++ author = format(LINK("/opencm/everyone/%s", CONTENT("%s")), ++ email, email); ++ stream_printf(out, "%s", xunsigned64_str(m->nRevisions)); ++ stream_printf(out, "%s", s->ser_type->tyName); ++ stream_printf(out, "%s", xlate_time(rev->reviseTime)); ++ stream_printf(out, "%s", author); + } + else { + stream_printf(out, "inaccessable"); +@@ -505,7 +526,7 @@ show_html(SDR_stream *out, Repository *r + Group *grp = (Group *) res->tail; + unsigned u; + +- stream_printf(out, "Group %s\n", decodedURI); ++ stream_printf(out, page_header(format("Group %s", decodedURI))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "Group
%s\n", decodedURI); +@@ -563,7 +584,7 @@ show_html(SDR_stream *out, Repository *r + (Buffer *)repos_GetEntity(repos, res->m->uri, + e->contentTrueName); + +- stream_printf(out, "File %s\n", res->fp_frag); ++ stream_printf(out, page_header(format("File %s", res->fp_frag))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "File %s\n", res->fp_frag); +@@ -599,7 +620,7 @@ show_html(SDR_stream *out, Repository *r + oc_uint64_t last = res->m->nRevisions - 1; + oc_uint64_t first = (last < 20) ? 0 : last - 19; + +- stream_printf(out, "Branch %s\n", res->fp_frag); ++ stream_printf(out, page_header(format("Branch %s", res->fp_frag))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "Branch %s\n", res->fp_frag); +@@ -636,6 +657,8 @@ show_html(SDR_stream *out, Repository *r + TRY { + u = repos_GetEntity(repos, res->m->uri, rev->revisor); + userName = pubkey_GetEmail(u->pubKey); ++ userName = format(LINK("/opencm/everyone/%s", CONTENT("%s")), ++ userName, userName); + } + DEFAULT(ex) { + } +@@ -669,7 +692,7 @@ show_html(SDR_stream *out, Repository *r + (CommitInfo *)repos_GetEntity(repos, res->m->uri, + chg->commitInfoTrueName); + +- stream_printf(out, "Commit %s\n", res->fp_frag); ++ stream_printf(out, page_header(format("Commit %s", res->fp_frag))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "Commit %s (%s)\n", res->fp_frag, xunsigned64_str(ver->rev)); +@@ -698,9 +721,8 @@ show_html(SDR_stream *out, Repository *r + + const char *revNo = xunsigned64_str(fsDir->rev); + +- stream_printf(out, "Commit %s, %s/\n", revNo, +- fsDir->path); +- ++ stream_printf(out, page_header(format("Commit %s, %s/", ++ revNo, fsDir->path))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "Commit %s, %s/\n", revNo, fsDir->path); +@@ -722,7 +744,8 @@ show_html(SDR_stream *out, Repository *r + { + const char *tname = res->tail->ser_type->tyName; + +- stream_printf(out, "Unhandled %s\n", res->fp_frag); ++ stream_printf(out, page_header(format("Unhandled %s", ++ res->fp_frag))); + stream_printf(out, BODY); + stream_printf(out, "
\n"); + stream_printf(out, "Unhandled type %s\n", tname); +@@ -771,7 +794,7 @@ opencm_browse(WorkSpace *ws, int argc, c + + if (v == 0 || vec_size(v) != 1) { + xprintf("\n"); +- xprintf("%s\n", arg); ++ xprintf(page_header(arg)); + xprintf("\n"); + xprintf("
\n"); +@@ -796,9 +819,7 @@ opencm_browse(WorkSpace *ws, int argc, c + ok = FALSE; + + xprintf(""); +- xprintf(""); +- xprintf("EXCEPTION!"); +- xprintf(""); ++ xprintf(page_header("EXCEPTION!")); + xprintf(""); + xprintf("
");
  
-       *to++ = '%';
-       *to++ = hex[c >> 4];
diff --git a/devel/opencm/patches/patch-base_src_client_command_c b/devel/opencm/patches/patch-base_src_client_command_c
index 05298e5c729..102015c7bb9 100644
--- a/devel/opencm/patches/patch-base_src_client_command_c
+++ b/devel/opencm/patches/patch-base_src_client_command_c
@@ -1,6 +1,26 @@
+$OpenBSD: patch-base_src_client_command_c,v 1.3 2002/08/28 22:23:29 todd Exp $
 --- base/src/client/command.c.orig	Mon Aug  5 16:03:03 2002
-+++ base/src/client/command.c	Tue Aug 27 12:30:49 2002
-@@ -154,7 +154,7 @@ struct command top_cmds[] = {
++++ base/src/client/command.c	Wed Aug 28 14:26:40 2002
+@@ -100,6 +100,8 @@ struct command create_cmds[] = {
+     "create-branch.help" },
+   { "group",       opencm_create_group,      1, CF_NAME, 0,
+     "create-group.help" },
++  { "project",     opencm_create_project,    1, CF_NAME, 0,
++    "create-project.help" },
+   { "repository",  opencm_create_repository, 3, 
+     CF_NOCONNECT|CF_ADMIN, 0, 
+     "create-repository.help" },
+@@ -143,8 +145,7 @@ struct command show_workspace_cmds[] = {
+ };
+ 
+ struct command show_cmds[] = {
+-  { "object",        opencm_show_object, 1, CF_OPTARGS, 0,
+-    "show-object.help" },
++  { "object",        opencm_show_object, 1, CF_OPTARGS, 0, 0 },
+   { "workspace",     0,                  0, 0, show_workspace_cmds, 0 },
+   { (char *)0 }
+ };
+@@ -154,7 +155,7 @@ struct command top_cmds[] = {
    { "add",       opencm_add_file,   1, CF_OPTARGS|CF_NOCONNECT|CF_WSINIT, 0,
      "add.help" },
    { "adduser",   opencm_add_user,   2, CF_ADMIN, 0,
@@ -9,3 +29,52 @@
    { "bind",      opencm_bind,       2, 0, 0,
      "bind.help" },
    { "browse",    opencm_browse,     0, CF_OPTARGS, 0, 0 },
+@@ -170,9 +171,8 @@ struct command top_cmds[] = {
+   { "diff",      opencm_diff,       0, CF_OPTARGS|CF_WSINIT, 0,
+     "diff.help" },
+ #ifdef DEBUG
+-  { "dump",      opencm_dump,       0, 0, 0, 0 },
+-  { "enumerate", opencm_enumerate,  0, CF_OPTARGS, 0,
+-    "enumerate.help" },
++  { "dump",      opencm_dump,       0, CF_WSINIT, 0, 0 },
++  { "enumerate", opencm_enumerate,  0, CF_OPTARGS, 0, 0 },
+ #endif
+   { "gadd",      opencm_add_member,     2, 0, 0,
+     "gadd.help" },
+@@ -192,7 +192,7 @@ struct command top_cmds[] = {
+   { "mkdir",     opencm_mkdir,      1, 0, 0,
+     "mkdir.help" },
+   { "mv",        opencm_rename,      2, CF_WSINIT|CF_NOCONNECT, 0,
+-    "rename-entity.help" }, /* shortcut! */
++    "mv.help" },
+ 
+   /* NOTE: This is for testing the new diff algorithm. It will later
+      be removed. */
+@@ -204,8 +204,7 @@ struct command top_cmds[] = {
+     "notes.help" },
+   { "options",   0,                 0, 0, options_cmds, 0 },
+ #ifdef DEBUG  
+-  { "preds",     opencm_preds,      1, CF_OPTARGS|CF_WSINIT, 0,
+-    "preds.help" },
++  { "preds",     opencm_preds,      1, CF_OPTARGS|CF_WSINIT, 0, 0 },
+ #endif
+   { "rebind",    opencm_rebind,     2, 0, 0,
+     "rebind.help" }, 
+@@ -215,7 +214,7 @@ struct command top_cmds[] = {
+   { "revert",    opencm_revert,     0, CF_WSINIT, 0,
+     "revert.help" },
+   { "rm",        opencm_remove_file,1, CF_OPTARGS|CF_NOCONNECT|CF_WSINIT, 0,
+-    "remove-file.help" }, /* shortcut! */
++    "rm.help" },
+   { "server",    opencm_server,     1, CF_NOCONNECT, 0,
+     "server.help" },
+   { "set",       0,                 0, 0, set_cmds, 0 },
+@@ -236,7 +235,7 @@ struct command top_cmds[] = {
+   { "version",   opencm_version,    0, CF_OPTCONNECT, 0,
+     "version.help" },
+   { "whoami",    opencm_whoami,     0, CF_NOCONNECT|CF_WSINIT, 0,
+-    "whoami.help"},
++    "whoami.help" },
+   { "xdcs",      0,                 0, 0, xdcs_cmds, 0 },
+   { (char *)0 }
+ };
diff --git a/devel/opencm/patches/patch-base_src_client_command_h b/devel/opencm/patches/patch-base_src_client_command_h
new file mode 100644
index 00000000000..60f7ef22158
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_client_command_h
@@ -0,0 +1,11 @@
+$OpenBSD: patch-base_src_client_command_h,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/client/command.h.orig	Mon Aug  5 16:03:03 2002
++++ base/src/client/command.h	Wed Aug 28 14:26:40 2002
+@@ -83,6 +83,7 @@ opencm_find_command(int argc, char **arg
+ extern void opencm_server(WorkSpace *, int argc, char **argv);
+ 
+ extern void opencm_create_branch(WorkSpace *, int argc, char **argv);
++extern void opencm_create_project(WorkSpace *, int argc, char **argv);
+ extern void opencm_rename(WorkSpace *, int argc, char **argv);
+ extern void opencm_version(WorkSpace *, int argc, char **argv);
+ extern void opencm_checkout(WorkSpace *, int argc, char **argv);
diff --git a/devel/opencm/patches/patch-base_src_client_opencm_c b/devel/opencm/patches/patch-base_src_client_opencm_c
index 72ec599b42d..fb24148bda5 100644
--- a/devel/opencm/patches/patch-base_src_client_opencm_c
+++ b/devel/opencm/patches/patch-base_src_client_opencm_c
@@ -1,12 +1,300 @@
-$OpenBSD: patch-base_src_client_opencm_c,v 1.1 2002/08/27 17:43:14 todd Exp $
+$OpenBSD: patch-base_src_client_opencm_c,v 1.2 2002/08/28 22:23:29 todd Exp $
 --- base/src/client/opencm.c.orig	Mon Aug  5 23:58:07 2002
-+++ base/src/client/opencm.c	Tue Aug 27 12:25:26 2002
-@@ -334,7 +334,7 @@ client_doDupBranchMut(Repository *r, Res
- 		      unsigned mutFlags)
- {
-   Mutable *dupM = NULL;
--  unsigned long version = 0ul;
-+  u_int32_t version = 0ul;
++++ base/src/client/opencm.c	Wed Aug 28 14:26:40 2002
+@@ -104,8 +104,12 @@ relative_to_homedir(const char *path)
+   return path_join("~", path);
+ }
  
-   /* By default, we want to copy the ACLs when we duplicate the mutable.
-    * The --private command line option overrides this and sets the ACLs of
++/* Given command line args, convert them to pathnames (or "pathglobs")
++   that are relative to the top of the Workspace.  This is needed
++   because all client commands are currently executed with respect to
++   the Workspace topdir. */
+ static StrVec *
+-args_to_wsnames(WorkSpace *ws, int argc, char **argv)
++normalize_args(WorkSpace *ws, int argc, char **argv)
+ {
+   unsigned i;
+   StrVec *nmlist = strvec_create();
+@@ -129,19 +133,7 @@ args_to_wsnames(WorkSpace *ws, int argc,
+     if (nm == NULL)
+       continue;
+ 
+-    /* FIX: We have a bug when 'nm' is a dir but is missing! */
+-    if (path_isdir(nm)) {
+-      unsigned v;
+-
+-      for (v = 0; v < vec_size(ws->pc->entSet); v++) {
+-	WsEntity *wse_u = (WsEntity *) vec_fetch(ws->pc->entSet, v);
+-
+-	if(glob_match(wse_u->cur_fsName, nm, GM_FS_COMPONENT))
+-	  strvec_append(nmlist, wse_u->cur_fsName);
+-
+-      }
+-    } else
+-      strvec_append(nmlist, nm);
++    strvec_append(nmlist, nm);
+   }
+ 
+   return nmlist;
+@@ -195,7 +187,7 @@ opencm_resolve(WorkSpace *ws, int argc, 
+       Serializable *s = res->tail ? res->tail : res->s;
+       report(0, "tail[%s] s[%s] rest[%s] for %s (and fp_frag = %s)\n",
+ 	     res->tail ? res->tail->ser_type->tyName : "",
+-	     s->ser_trueName,
++             ser_getTrueName(s),
+ 	     res->rest,
+ 	     res->fullPath,
+ 	     res->fp_frag);
+@@ -920,6 +912,27 @@ opencm_create_repository(WorkSpace *ws, 
+ } 
+ 
+ void
++opencm_create_project(WorkSpace *ws, int argc, char **argv)
++{
++  char *description = NULL;
++  Mutable *m = NULL;
++  Repository *r = this_repos;
++  
++  xassert(opt_Name);
++  
++  if (!validate_pet_name(path_tail(argv[0])))
++    THROW(ExBadValue, format("Invalid name: %s", argv[0]));
++  
++  /* Note that get_message() will take whatever's in opt_Message if
++     it's not NULL.  It opt_Message is NULL, then user gets
++     prompted. */
++  description = get_message("Please enter description\n", 
++                            xstrcat(COMMENT_LEADER, " New Project:"), 0);
++  
++  m = client_doCreateProject(r, opt_Name, description, argv[0]); 
++}
++
++void
+ opencm_create_branch(WorkSpace *ws, int argc, char **argv)
+ {
+   char *description = NULL;
+@@ -1007,13 +1020,17 @@ void
+ opencm_preds(WorkSpace *ws, int argc, char **argv)
+ {
+   int i;
+-  void *v;
+   Entity *ent;
+   Repository *r = ws->r;
+-  
++  void *v;
++
+   for (i = 0; i < argc; i++) {
+     TRY {
+-      v = repos_GetEntity(r, argv[i]);
++      /* This is wrong, but at least it compiles now. Since I don't know what
++         this command is for, it's hard to know what should be done here.
++           - JL (8/20/2002)
++      */
++      v = repos_GetEntity(r, 0, argv[i]);
+     }
+     DEFAULT(AnyException) {
+       v = NULL;
+@@ -1022,8 +1039,8 @@ opencm_preds(WorkSpace *ws, int argc, ch
+     if (v == NULL)
+       continue;
+ 
+-    ent = (Entity *)v;
+-    xprintf("Entity:        %s\n", ent->serTrueName);
++    ent = (Entity*)v;
++    xprintf("Entity:        %s\n", ser_getTrueName(ent));
+     xprintf("  parent:      %s\n",
+ 	    ent->parent ? ent->parent : "");
+     xprintf("  mergeParent: %s\n",
+@@ -1111,9 +1128,7 @@ opencm_checkout(WorkSpace *ws, int argc,
+ void
+ opencm_dump(WorkSpace *ws, int argc, char **argv)
+ {
+-  Repository *r = ws->r;
+-
+-  if (!ws->haveProject) {
++  if (!ws || !ws->haveProject) {
+     report(0, "No project found.\n");
+     return;
+   }
+@@ -1156,14 +1171,6 @@ static OC_bool __attribute__ ((unused))
+   return (ws_Lookup(ws, relpath) ? FALSE : TRUE);
+ }
+ 
+-#ifdef DEBUG
+-static OC_bool
+-is_not_ignored(WorkSpace *ws, const char *relpath)
+-{
+-  return TRUE;
+-}
+-#endif
+-
+ static int
+ check_for_conditionals(WorkSpace *ws)
+ {
+@@ -1279,7 +1286,7 @@ do_log_entity(WorkSpace *ws, Entity *ent
+ 	  } 
+ 	}
+ 	if (!found)
+-	  continue;
++	  break;
+ 
+ 	/* Now we have the parent Entity and can display its ci message */
+ 	ci = (CommitInfo *)repos_GetEntity(ws->r, ws->pc->branchURI, 
+@@ -1313,38 +1320,54 @@ do_remove(WorkSpace *ws, StrVec *argname
+ {
+   unsigned u;
+ 
+-  if (argnames) strvec_sort(argnames);
++  assert(argnames);
++
++  argnames = ws_EnumerateWsEnts(ws, argnames);
+ 
+-  for (u = 0; u < vec_size(argnames); u++) {
+-    ws_RemoveFile(ws, vec_fetch(argnames, u));
++  if (vec_size(argnames) == 0)
++    report(1, "Nothing to remove.\n");
++  else {
++    strvec_sort(argnames);
++
++    for (u = 0; u < vec_size(argnames); u++) {
++      ws_RemoveFile(ws, vec_fetch(argnames, u));
++    }
+   }
+ }
+ 
++/* Returns number of unknown files. */
+ static int
+ do_status(WorkSpace *ws, StrVec *argnames)
+ {
+   int i;
+-  StrVec *names = NULL;
++  StrVec *unknown = strvec_create();
+ 
+-  pendingchange_RecomputeStatus(ws->pc, argnames);
+-  pendingchange_ReportStatus(ws->pc, argnames);
++  /* Build a list of known WsEntity names from 'argnames'.  Use this
++     list for the pendingchange_XXX calls. */
++  StrVec *names = ws_EnumerateWsEnts(ws, argnames);
++
++  pendingchange_RecomputeStatus(ws->pc, names);
++  pendingchange_ReportStatus(ws->pc, names);
+ 
+   /* Now make a separate pass to report unknown files: */
+   if (argnames) {
+     unsigned u;
+-    names = strvec_create();
+ 
+     for (u = 0; u < vec_size(argnames); u++) 
+-      ws_EnumeratePath(ws, names, vec_fetch(argnames, u), 
+-		       WSE_NORMAL, discard_wsentities);
++      /* Ignore SYMLINKS and no need to NORMALIZE again: */
++      ws_EnumeratePath(ws, unknown, vec_fetch(argnames, u), 
++		       WSE_FILES|WSE_FILTER, discard_wsentities);
+   }
+   else
+-    names = ws_Enumerate(ws, WSE_NORMAL, discard_wsentities);
++    /* Ignore SYMLINKS and no need to NORMALIZE the ws->topDir */
++    ws_EnumeratePath(ws, unknown, path_curdir(), 
++                     WSE_FILES|WSE_FILTER, 
++		      discard_wsentities);
+ 
+-  for (i = 0; i < vec_size(names); i++)
+-    xprintf("? %s\n", vec_fetch(names, i));
++  for (i = 0; i < vec_size(unknown); i++)
++    xprintf("? %s\n", vec_fetch(unknown, i));
+ 
+-  return vec_size(names);
++  return vec_size(unknown);
+ }
+ 
+ void
+@@ -1529,7 +1552,7 @@ opencm_status(WorkSpace *ws, int argc, c
+     return;
+   }
+ 
+-  paths = args_to_wsnames(ws, argc, argv);
++  paths = normalize_args(ws, argc, argv);
+   (void) do_status(ws, paths);
+ 
+   /* Now that status updates things we need to track, we need to
+@@ -1561,7 +1584,7 @@ opencm_update(WorkSpace *ws, int argc, c
+   pendingchange_ReportStatus(ws->pc, 0);
+ 
+   names = strvec_create();
+-  names = ws_Enumerate(ws, WSE_NORMAL, discard_wsentities);
++  ws_EnumeratePath(ws, names, path_curdir(), WSE_STANDARD, discard_wsentities);
+ 
+   for (i = 0; i < vec_size(names); i++)
+     xprintf("? %s\n", vec_fetch(names, i));
+@@ -1618,7 +1641,7 @@ opencm_commit(WorkSpace *ws, int argc, c
+   report(3, "Before status");
+ 
+   if (argc > 0)
+-    names = args_to_wsnames(ws, argc, argv);
++    names = normalize_args(ws, argc, argv);
+ 
+   if (do_status(ws, names) &&
+       !opencm_confirm("Unknown files. Are you sure?", 1))
+@@ -1654,7 +1677,12 @@ opencm_add_file(WorkSpace *ws, int argc,
+       THROW(ExNoObject, 
+ 	    format("File/dir \"%s\" does not exist", argv[i]));
+ 
+-    ws_EnumeratePath(ws, names, argv[i], WSE_NORMAL, 0);
++    ws_EnumeratePath(ws, names, argv[i], WSE_STANDARD, 0);
++  }
++
++  if (vec_size(names) == 0) {
++    report(1, "Nothing to add.\n");
++    return;
+   }
+ 
+   /* This is trickier than it looks, because argv[x] is always
+@@ -1684,7 +1712,7 @@ opencm_remove_file(WorkSpace *ws, int ar
+     return;
+   }
+ 
+-  paths = args_to_wsnames(ws, argc, argv);
++  paths = normalize_args(ws, argc, argv);
+ 
+   do_remove(ws, paths);
+ 
+@@ -1700,7 +1728,7 @@ opencm_enumerate(WorkSpace *ws, int argc
+   StrVec *names;
+   StrVec *nmlist = nmlist_create(ws->relStartDir, argc, argv);
+ 
+-  names = ws_Enumerate(ws, is_not_ignored);
++  names = ws_EnumerateWsEnts(ws, nmlist);
+ 
+   for (i = 0; i < vec_size(names); i++) {
+     const char *nm = vec_fetch(names, i);
+@@ -1717,7 +1745,6 @@ opencm_diff(WorkSpace *ws, int argc, cha
+   ObVec *v;
+   int i;
+ 
+-  //StrVec *nmlist = nmlist_create(ws->relStartDir, argc, argv);
+   StrVec *names;
+ 
+   if (!ws->haveProject) {
+@@ -1725,18 +1752,19 @@ opencm_diff(WorkSpace *ws, int argc, cha
+     return;
+   }
+ 
++  names = strvec_create();
++
+   if (argc) {
+-    names = strvec_create();
+     for (i = 0; i < argc; i++) {
+       if (!path_exists(ws_NormalizePath(ws, argv[i])))
+ 	THROW(ExNoObject, 
+ 	      format("File/dir \"%s\" does not exist", argv[i]));
+ 
+-      ws_EnumeratePath(ws, names, argv[i], WSE_NORMAL, 0);
++      ws_EnumeratePath(ws, names, argv[i], WSE_STANDARD, 0);
+     }
+   }
+   else
+-    names = ws_Enumerate(ws, WSE_NORMAL, keep_wsentities);
++    ws_EnumeratePath(ws, names, path_curdir(), WSE_STANDARD, keep_wsentities);
+ 
+ 
+   if (opt_Against) {
diff --git a/devel/opencm/patches/patch-base_src_common_ChannelSSL_c b/devel/opencm/patches/patch-base_src_common_ChannelSSL_c
deleted file mode 100644
index edb792678b3..00000000000
--- a/devel/opencm/patches/patch-base_src_common_ChannelSSL_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_ChannelSSL_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/ChannelSSL.c.orig	Sun Aug  4 11:51:37 2002
-+++ base/src/common/ChannelSSL.c	Tue Aug 27 12:25:27 2002
-@@ -117,7 +117,7 @@ chan_alisten_ssl(ChannelCompletionFn fn,
- }
- 
- static void
--report_ssl_error(int level, unsigned long errcode)
-+report_ssl_error(int level, u_int32_t errcode)
- {
-  if(errcode == 0)
-    report(level, "No OpenSSL error reported (!)\n");
diff --git a/devel/opencm/patches/patch-base_src_common_EntityCache_c b/devel/opencm/patches/patch-base_src_common_EntityCache_c
deleted file mode 100644
index fda38066063..00000000000
--- a/devel/opencm/patches/patch-base_src_common_EntityCache_c
+++ /dev/null
@@ -1,14 +0,0 @@
-$OpenBSD: patch-base_src_common_EntityCache_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/EntityCache.c.orig	Mon Jul 29 22:48:38 2002
-+++ base/src/common/EntityCache.c	Tue Aug 27 12:25:27 2002
-@@ -61,8 +61,8 @@ struct EcacheNode {
- };
- 
- struct EntityCache {
--  unsigned long sz;
--  unsigned long max;
-+  u_int32_t sz;
-+  u_int32_t max;
-   rbtree *tree;
- 
-   EcacheNode *oldest;		/* pointer to oldest */
diff --git a/devel/opencm/patches/patch-base_src_common_Entity_h b/devel/opencm/patches/patch-base_src_common_Entity_h
deleted file mode 100644
index c737ad7b08b..00000000000
--- a/devel/opencm/patches/patch-base_src_common_Entity_h
+++ /dev/null
@@ -1,21 +0,0 @@
-$OpenBSD: patch-base_src_common_Entity_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/Entity.h.orig	Thu Jul 18 20:30:51 2002
-+++ base/src/common/Entity.h	Tue Aug 27 12:25:27 2002
-@@ -58,7 +58,7 @@ struct Entity {
-    */
-   
-   const char *contentTrueName;
--  unsigned long length;		/* length of object */
-+  u_int32_t length;		/* length of object */
- 
-   /* Miscellaneous per-entity meta information. Much of this is
-    * contained in the Change record, but it isn't accessable to the
-@@ -72,7 +72,7 @@ struct Entity {
-   
-   unsigned char entityType;	/* type of content */
- 
--  unsigned long entityPerms;	/* permissions flags */
-+  u_int32_t entityPerms;	/* permissions flags */
- 
-   const char *parent;	       /* preceding Entity (on same Branch) */
-   const char *mergeParent;     /* merged, preceding Entity (if any) */
diff --git a/devel/opencm/patches/patch-base_src_common_OS_unix-path_c b/devel/opencm/patches/patch-base_src_common_OS_unix-path_c
new file mode 100644
index 00000000000..99ba6a2607e
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_common_OS_unix-path_c
@@ -0,0 +1,38 @@
+$OpenBSD: patch-base_src_common_OS_unix-path_c,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/common/OS/unix-path.c.orig	Thu Jul 18 20:30:50 2002
++++ base/src/common/OS/unix-path.c	Wed Aug 28 14:26:40 2002
+@@ -305,15 +305,30 @@ path_portstat(const char *fname, portsta
+ 
+   memset(ps, 0, sizeof(*ps));
+ 
+-  result = stat(fname, &sb);
++  /* Use "lstat" here so we don't traverse any symlinks! Originally we
++     used just "stat", and ran into interesting results as OpenCM
++     tried to follow the symlinks to their targets. */
++  result = lstat(fname, &sb);
+   if (result == -1) {
+     if (errno == ENOENT) {
+       ps->exists = FALSE;
+       return;
+     }
+-
+-    THROW(ExNoObject,
+-	  format("Could not stat path [%s]: errno %d", fname, errno));
++    /* A component of the path is not a directory:
++         We don't want to just ignore this, because 'update' will fail when it
++         tries to write to something inside the "directory". But making the
++         error message more descriptive is nice, so users can understand what
++         is wrong, and hopefully how to fix it (that may be a bit of a stretch,
++         but whatever)
++    */
++    else if (errno == ENOTDIR) {
++      THROW(ExNoObject,
++            format("One or more components of %s is not a directory", fname));
++    }
++    else {
++      THROW(ExNoObject,
++            format("Could not stat path [%s]: errno %d", fname, errno));
++    }
+   }
+ 
+   ps->exists = TRUE;
diff --git a/devel/opencm/patches/patch-base_src_common_ObDict_h b/devel/opencm/patches/patch-base_src_common_ObDict_h
deleted file mode 100644
index 001e84df6a4..00000000000
--- a/devel/opencm/patches/patch-base_src_common_ObDict_h
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_ObDict_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/ObDict.h.orig	Wed Jul 17 23:27:55 2002
-+++ base/src/common/ObDict.h	Tue Aug 27 12:25:27 2002
-@@ -44,7 +44,7 @@
- typedef struct ObDictEntry ObDictEntry;
- struct ObDictEntry {
-   const char *trueName;		/* of the object */
--  unsigned long tnHash;	        /* hash of the truename for quick compare */
-+  u_int32_t tnHash;	        /* hash of the truename for quick compare */
-   unsigned w;			/* aux word */
- 
-   void *value;
diff --git a/devel/opencm/patches/patch-base_src_common_PRNG_c b/devel/opencm/patches/patch-base_src_common_PRNG_c
new file mode 100644
index 00000000000..8471e0eabc3
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_common_PRNG_c
@@ -0,0 +1,37 @@
+$OpenBSD: patch-base_src_common_PRNG_c,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/common/PRNG.c.orig	Thu Jul 18 20:30:48 2002
++++ base/src/common/PRNG.c	Wed Aug 28 14:26:40 2002
+@@ -75,18 +75,17 @@ void initialize_PRNG(void)
+   if(getenv("RANDFILE"))
+     RAND_load_file(getenv("RANDFILE"), MAX_READ);
+ 
+-  /* We limit gathering entropy from EGD to only 128 bytes. This is because
+-       a) EGD is slow
+-       b) EGD will sometimes crash if too many requests come in. I reported
+-          this to the author a few months ago, but never got a response.
+-       c) EGD gathers entropy at a not very fast rate; if we read much
+-          more than this, we'll probably start running out, which would
+-          be bad, especially for the client (several invocations might occur
+-          over the course of only a few minutes)
++  /* We limit gathering entropy from an EGD socket to only 128 bytes to work
++     around some flaws in the design of EGD (in particular, EGD is slow, it
++     will crash if too many requests come in too fast, it gathers entropy
++     slowly, and it will block if it doesn't have enough).
+ 
+-     However, EGD is by far the best choice for a RNG on systems that don't
+-     have /dev/random, so it seems wise to support it.
+-   */
++     I (Jack L) recommend using PRNGD (a fast and stable EGD clone written in
++     C) instead of EGD for these reasons.
++
++     RAND_egd_bytes is only available in OpenSSL 0.9.6 and up. However, given
++     that 0.9.5 and previous versions have exploitable overflows, this is not a
++     major concern.  */
+   if(getenv("EGD_PATH"))
+     RAND_egd_bytes(getenv("EGD_PATH"), 128);
+ 
+@@ -96,3 +95,4 @@ void initialize_PRNG(void)
+     THROW(ExPrngError, "Insufficient randomness to seed the PRNG");
+   }
+ }
++
diff --git a/devel/opencm/patches/patch-base_src_common_Revision_c b/devel/opencm/patches/patch-base_src_common_Revision_c
deleted file mode 100644
index 79a1b1faa45..00000000000
--- a/devel/opencm/patches/patch-base_src_common_Revision_c
+++ /dev/null
@@ -1,14 +0,0 @@
-$OpenBSD: patch-base_src_common_Revision_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/Revision.c.orig	Mon Jul 29 22:48:34 2002
-+++ base/src/common/Revision.c	Tue Aug 27 12:25:27 2002
-@@ -47,8 +47,8 @@ revision_show(const void *vp)
-   
-   xprintf("mutURI:     %s\n", r->mutURI);
-   xprintf("Seq Num:    0x%08x%08x\n",
--      (unsigned long) (r->seq_number >> 32),
--      (unsigned long) (r->seq_number));
-+      (u_int32_t) (r->seq_number >> 32),
-+      (u_int32_t) (r->seq_number));
-   xprintf("ReviseTime: %s\n", r->reviseTime);
-   xprintf("Revisor:    %s\n", r->revisor);
-   xprintf("NewObject:  %s\n", r->newObject);
diff --git a/devel/opencm/patches/patch-base_src_common_SDR_c b/devel/opencm/patches/patch-base_src_common_SDR_c
index 2af49ba45e4..9e91364cfc8 100644
--- a/devel/opencm/patches/patch-base_src_common_SDR_c
+++ b/devel/opencm/patches/patch-base_src_common_SDR_c
@@ -1,297 +1,134 @@
-$OpenBSD: patch-base_src_common_SDR_c,v 1.1 2002/08/27 17:43:14 todd Exp $
+$OpenBSD: patch-base_src_common_SDR_c,v 1.2 2002/08/28 22:23:29 todd Exp $
 --- base/src/common/SDR.c.orig	Mon Jul 29 22:48:31 2002
-+++ base/src/common/SDR.c	Tue Aug 27 12:27:10 2002
-@@ -82,8 +82,8 @@ struct serializer {
-   void           (*w_u16)(const char *, SDR_stream *, unsigned short);
-   unsigned short (*r_u16)(const char *, SDR_stream *);
++++ base/src/common/SDR.c	Wed Aug 28 14:26:40 2002
+@@ -116,13 +116,15 @@ file_stream_putc(SDR_stream *s, int c)
+   s->pos++;
+   s->len++;
+   s->bound++;
+-  return fputc(c, s->state);
++  return fputc(c, (FILE*)s->state);
+ }
  
--  void           (*w_u32)(const char *, SDR_stream *, unsigned long);
--  unsigned long  (*r_u32)(const char *, SDR_stream *);
-+  void           (*w_u32)(const char *, SDR_stream *, u_int32_t);
-+  u_int32_t  (*r_u32)(const char *, SDR_stream *);
- 
-   void           (*w_u64)(const char *, SDR_stream *, 
- 			  oc_uint64_t);
-@@ -92,8 +92,8 @@ struct serializer {
-   void           (*w_buffer)(const char *elem, SDR_stream *, const Buffer*);
-   Buffer *       (*r_buffer)(const char *elem, SDR_stream *, ocmoff_t len);
- 
--  void           (*w_bytes)(const char *, SDR_stream *, unsigned long len, const void *);
--  void *         (*r_bytes)(const char *, SDR_stream *, unsigned long len);
-+  void           (*w_bytes)(const char *, SDR_stream *, u_int32_t len, const void *);
-+  void *         (*r_bytes)(const char *, SDR_stream *, u_int32_t len);
- 
-   void           (*w_string)(const char *, SDR_stream *, const char *);
-   char *         (*r_string)(const char *, SDR_stream *);
-@@ -568,8 +568,8 @@ stream_ungetc(SDR_stream *strm, int c)
- size_t
- stream_vprintf(SDR_stream *s, const char *fmt, va_list ap)
+ static ocmoff_t
+ file_stream_puts(SDR_stream *s, const void *vp, ocmoff_t len)
  {
--  unsigned long len;
--  unsigned long width = 0;
-+  u_int32_t len;
-+  u_int32_t width = 0;
-   OC_bool sign;
-   OC_bool rightAdjust;
-   char fillchar;
-@@ -584,7 +584,7 @@ stream_vprintf(SDR_stream *s, const char
-       continue;
+-  size_t wlen = fwrite(vp, 1, len, s->state);
++  size_t wlen = fwrite(vp, 1, len, (FILE*)s->state);
++  if(len != wlen || ferror((FILE*)s->state))
++    THROW(ExTruncated, format("Writing to %s was truncated\n", s->name));
+   s->pos += wlen;
+   s->len += wlen;
+   s->bound += wlen;
+@@ -142,7 +144,7 @@ file_stream_getc(SDR_stream *s)
+ {
+   int c;
+ 
+-  c = fgetc(s->state);
++  c = fgetc((FILE*)s->state);
+   s->pos++;
+   return c;
+ }
+@@ -150,7 +152,7 @@ file_stream_getc(SDR_stream *s)
+ static ocmoff_t
+ file_stream_gets(SDR_stream *s, void *vp, ocmoff_t len)
+ {
+-  size_t rlen = fread(vp, 1, len, s->state);
++  size_t rlen = fread(vp, 1, len, (FILE*)s->state);
+   s->pos += rlen;
+   
+   return rlen;
+@@ -161,8 +163,8 @@ file_stream_reread(SDR_stream *s)
+ {
+   assert(s->state);
+ 
+-  fflush(s->state);
+-  rewind(s->state);
++  fflush((FILE*)s->state);
++  rewind((FILE*)s->state);
+   s->pos = 0;
+ 
+   s->mode = MODE_RSTREAM;
+@@ -175,7 +177,7 @@ static void
+ file_stream_close(SDR_stream *s)
+ {
+   if (s->state) {
+-    fflush(s->state);
++    fflush((FILE*)s->state);
+     xfclose((FILE *) s->state);
+   }
+   s->state = 0;
+@@ -1028,7 +1030,7 @@ stream_autodetect_format(SDR_stream *str
+       /* Texty format starts with TEXTY\n
+        *
+        * The newline isn't really necessary, but otherwise the file
+-       * will look kind of ugly, with stupid stuff like Tobtype ...
++       * will look kind of ugly, with stupid stuff like TEXTYobtype 5...
+        */
+       const char* expecting = "EXTY\n";
+ 
+@@ -1046,6 +1048,26 @@ stream_autodetect_format(SDR_stream *str
+ 
+       break;
+     }
++  case 'D':
++    {
++      /* Texty format starts with DTEXTY\n
++       */
++      const char* expecting = "TEXTY\n";
++
++      do {
++        c = stream_getc(stream);
++        if(c != *expecting)
++          THROW(ExMalformed,
++                format("Bad stream format (thought it was DTEXTY); "
++                       "source \"%s\", starts with char %x\n",
++                       stream->name, c));
++        expecting++;
++      } while (c != '\n');
++
++      stream->format = SDR_DTEXTY;
++
++      break;
++    }
+   default:
+     {
+       THROW(ExMalformed, 
+@@ -2125,6 +2147,11 @@ isSafeChar(unsigned char c)
+   return (isprint(c) && c != ENCODE_CHAR) || isspace(c);
+ }
+ 
++static void dtexty_onCreate(SDR_stream *strm)
++{
++  stream_printf(strm, "DTEXTY\n");
++}
++
+ static ocmoff_t
+ encodedLength(const void *vp, ocmoff_t len)
+ {
+@@ -2207,7 +2234,6 @@ dtexty_get_field(const char *name, char 
+   {
+     /* Do an in-place conversion to safe form on the string that came
+        back: */
+-    
+     unsigned char *base = fld->rep;
+     unsigned char *end = base + fld->value;
+     unsigned char *to = fld->rep;
+@@ -2240,8 +2266,7 @@ dtexty_get_field(const char *name, char 
+ 	  THROW(ExMalformed, "Mis-encoded or malformed input string");
+ 
+       }
+-      else
+-	*to++ = c;
++      *to++ = c;
      }
  
--    /* largest thing we might convert fits in 20 digits (unsigned long
-+    /* largest thing we might convert fits in 20 digits (u_int32_t
-      * long as decimal */
-     
-     pend = &buf[20];
-@@ -647,7 +647,7 @@ stream_vprintf(SDR_stream *s, const char
-     case 'd':
-       {
- 	long l;
--	unsigned long ul;
-+	u_int32_t ul;
- 
- 	l = va_arg(ap, long);
- 	      
-@@ -661,7 +661,7 @@ stream_vprintf(SDR_stream *s, const char
- 	  ul = (l < 0) ? (unsigned) -l : (unsigned) l;
- 
- 	  if (l == LONG_MIN)
--	    ul = ((unsigned long) LONG_MAX) + 1ul;
-+	    ul = ((u_int32_t) LONG_MAX) + 1ul;
- 
- 	  while(ul) {
- 	    *(--p) = '0' + (ul % 10);
-@@ -675,9 +675,9 @@ stream_vprintf(SDR_stream *s, const char
-       }
-     case 'u':
-       {
--	unsigned long ul;
-+	u_int32_t ul;
- 
--	ul = va_arg(ap, unsigned long);
-+	ul = va_arg(ap, u_int32_t);
- 	      
- 	if (ul == 0) {
- 	  *(--p) = '0';
-@@ -692,11 +692,11 @@ stream_vprintf(SDR_stream *s, const char
-       }
-     case 'x':
-       {
--	unsigned long ul;
-+	u_int32_t ul;
- 
- 	char *hexout = "0123456789abcdef";
- 
--	ul = va_arg(ap, unsigned long);
-+	ul = va_arg(ap, u_int32_t);
- 	      
- 	if (ul == 0) {
- 	  *(--p) = '0';
-@@ -826,7 +826,7 @@ stream_scanf(SDR_stream *s, const char *
-     case 'u':
-     case 'U':
-       {
--	unsigned long ull = 0;
-+	u_int32_t ull = 0;
- 
- 	do {
- 	  c = stream_getc(s);
-@@ -852,10 +852,10 @@ stream_scanf(SDR_stream *s, const char *
- 	--input_count;
- 
- 	if (*fmt == 'u') {
--	  unsigned long *ulp;
-+	  u_int32_t *ulp;
- 
--	  ulp = va_arg(ap, unsigned long *);
--	  *ulp = (unsigned long) ull;
-+	  ulp = va_arg(ap, u_int32_t *);
-+	  *ulp = (u_int32_t) ull;
- 	  assert(ull <= ULONG_MAX);
- 	}
- 	else {
-@@ -869,10 +869,10 @@ stream_scanf(SDR_stream *s, const char *
-       }
-     case 'x':
-       {
--	unsigned long ul = 0;
--	unsigned long *ulp;
-+	u_int32_t ul = 0;
-+	u_int32_t *ulp;
- 
--	ulp = va_arg(ap, unsigned long *);
-+	ulp = va_arg(ap, u_int32_t *);
- 
- 	do {
- 	  c = stream_getc(s);
-@@ -1345,13 +1345,13 @@ sdr_r_u16(const char *elem, SDR_stream *
- }
- 
- void
--sdr_w_u32(const char *elem, SDR_stream *strm, unsigned long u)
-+sdr_w_u32(const char *elem, SDR_stream *strm, u_int32_t u)
- {
-   assert(sermodes[strm->format].w_u32);
-   sermodes[strm->format].w_u32(elem, strm, u);  
- }
- 
--unsigned long
-+u_int32_t
- sdr_r_u32(const char *elem, SDR_stream *strm)
- {
-   assert(sermodes[strm->format].r_u32);
-@@ -1387,14 +1387,14 @@ sdr_r_buffer(const char *elem, SDR_strea
- }
- 
- void
--sdr_w_bytes(const char *elem, SDR_stream *strm, unsigned long len, const void *v)
-+sdr_w_bytes(const char *elem, SDR_stream *strm, u_int32_t len, const void *v)
- {
-   assert(sermodes[strm->format].w_bytes);
-   sermodes[strm->format].w_bytes(elem, strm, len, v);  
- }
- 
- void *
--sdr_r_bytes(const char *elem, SDR_stream *strm, unsigned long len)
-+sdr_r_bytes(const char *elem, SDR_stream *strm, u_int32_t len)
- {
-   assert(sermodes[strm->format].r_bytes);
-   return sermodes[strm->format].r_bytes(elem, strm, len);  
-@@ -1496,7 +1496,7 @@ bin_r_u16(const char *elem, SDR_stream *
-   u = 0;
- 
-   do {
--    unsigned long bu;
-+    u_int32_t bu;
-     
-     i--;
-     u = u << 8;
-@@ -1508,7 +1508,7 @@ bin_r_u16(const char *elem, SDR_stream *
- }
- 
- static void
--bin_w_u32(const char *elem, SDR_stream *strm, unsigned long u)
-+bin_w_u32(const char *elem, SDR_stream *strm, u_int32_t u)
- {
-   int i;
-   unsigned char bytes[sizeof(u)];
-@@ -1522,11 +1522,11 @@ bin_w_u32(const char *elem, SDR_stream *
-     THROW(ExTruncated, "Serialization write error");
- }
- 
--static unsigned long
-+static u_int32_t
- bin_r_u32(const char *elem, SDR_stream *strm)
- {
-   int i;
--  unsigned long u;
-+  u_int32_t u;
-   unsigned char bytes[sizeof(u)];
- 
-   if (stream_read(strm, bytes, sizeof(u)) < sizeof(u))
-@@ -1536,7 +1536,7 @@ bin_r_u32(const char *elem, SDR_stream *
-   u = 0;
- 
-   do {
--    unsigned long bu;
-+    u_int32_t bu;
-     
-     i--;
-     u = u << 8;
-@@ -1589,7 +1589,7 @@ bin_r_u64(const char *elem, SDR_stream *
- 
- /* Note that these do NOT read/write the actual length! */
- static void
--bin_w_bytes(const char *elem, SDR_stream *strm, unsigned long len, 
-+bin_w_bytes(const char *elem, SDR_stream *strm, u_int32_t len, 
- 	    const void *v)
- {
-   const char *s = (const char *) v;
-@@ -1599,7 +1599,7 @@ bin_w_bytes(const char *elem, SDR_stream
- }
- 
- static void *
--bin_r_bytes(const char *elem, SDR_stream *strm, unsigned long len)
-+bin_r_bytes(const char *elem, SDR_stream *strm, u_int32_t len)
- {
-   char * s = (char *) GC_MALLOC_ATOMIC(sizeof(char) * (len+1));
-   s[len] = 0;
-@@ -1935,7 +1935,7 @@ texty_w_u16(const char *elem, SDR_stream
- }
- 
- static void
--texty_w_u32(const char *elem, SDR_stream *strm, unsigned long num)
-+texty_w_u32(const char *elem, SDR_stream *strm, u_int32_t num)
- {
-   texty_do_indent(strm);
-   stream_printf(strm, "%s I %u\n", elem, num);
-@@ -1955,7 +1955,7 @@ texty_r_u16(const char *elem, SDR_stream
-   return fld->value;
- }
- 
--static unsigned long
-+static u_int32_t
- texty_r_u32(const char *elem, SDR_stream *strm)
- {
-   texty_field *fld = texty_get_field(elem, 'I', strm);
-@@ -1978,7 +1978,7 @@ texty_r_u64(const char *elem, SDR_stream
- 
- static void
- texty_w_bytestring(const char *elem, SDR_stream *strm, const char ty, 
--		   unsigned long len, const void *vp)
-+		   u_int32_t len, const void *vp)
- {
-   texty_do_indent(strm);
- 
-@@ -2019,14 +2019,14 @@ texty_r_buffer(const char *elem, SDR_str
- }
- 
- static void
--texty_w_bytes(const char *elem, SDR_stream *strm, unsigned long len,
-+texty_w_bytes(const char *elem, SDR_stream *strm, u_int32_t len,
-               const void *obj)
- {
-   texty_w_bytestring(elem, strm, 'B', len, obj);
- }
- 
- static void *
--texty_r_bytes(const char *elem, SDR_stream *strm, unsigned long len)
-+texty_r_bytes(const char *elem, SDR_stream *strm, u_int32_t len)
- {
-   texty_field *fld = texty_get_field(elem, 'B', strm);
-   return fld->rep;
-@@ -2169,7 +2169,7 @@ encodeString(const void *vp, ocmoff_t le
- 
- static void
- dtexty_w_bytestring(const char *elem, SDR_stream *strm, const char ty, 
--                    unsigned long len, const void *vp)
-+                    u_int32_t len, const void *vp)
- {
-   ocmoff_t elen = len;		/* encoded length */
-   const void *evp = vp;		/* encoded string */
-@@ -2334,7 +2334,7 @@ dtexty_get_field(const char *name, char 
- #if 0
- static void
- dtexty_w_bytestring(const char *elem, SDR_stream *strm, const char ty, 
--                    unsigned long len, const void *vp)
-+                    u_int32_t len, const void *vp)
- {
-   texty_do_indent(strm);
- 
-@@ -2415,14 +2415,14 @@ dtexty_r_buffer(const char *elem, SDR_st
-    dtexty_w_bytestring and dtexty_get_field. Yuck.
- */
- static void
--dtexty_w_bytes(const char *elem, SDR_stream *strm, unsigned long len,
-+dtexty_w_bytes(const char *elem, SDR_stream *strm, u_int32_t len,
-                const void *s)
- {
-   dtexty_w_bytestring(elem, strm, 'B', len, s);
- }
- 
- static void *
--dtexty_r_bytes(const char *elem, SDR_stream *strm, unsigned long len)
-+dtexty_r_bytes(const char *elem, SDR_stream *strm, u_int32_t len)
- {
-   texty_field *fld = dtexty_get_field(elem, 'B', strm);
-   return fld->rep;
+     fld->value = to - base;	/* len excludes terminating NUL */
+@@ -2539,7 +2564,7 @@ static struct serializer sermodes[] = {
+     texty_w_obname, texty_r_obname,
+     texty_write, texty_read },
+   /* DTEXTY streams */
+-  { texty_onCreate,
++  { dtexty_onCreate,
+     texty_w_u8, texty_r_u8,
+     texty_w_u16, texty_r_u16,
+     texty_w_u32, texty_r_u32,
diff --git a/devel/opencm/patches/patch-base_src_common_SDR_h b/devel/opencm/patches/patch-base_src_common_SDR_h
deleted file mode 100644
index f9c074f8c5e..00000000000
--- a/devel/opencm/patches/patch-base_src_common_SDR_h
+++ /dev/null
@@ -1,25 +0,0 @@
-$OpenBSD: patch-base_src_common_SDR_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/SDR.h.orig	Mon Jul 22 02:02:49 2002
-+++ base/src/common/SDR.h	Tue Aug 27 12:25:27 2002
-@@ -104,17 +104,17 @@ void           sdr_w_u16(const char *ele
- unsigned short sdr_r_u16(const char *elem, SDR_stream *);
- 
- void           sdr_w_u32(const char *elem, SDR_stream *,
--			   unsigned long);
--unsigned long  sdr_r_u32(const char *elem, SDR_stream *);
-+			   u_int32_t);
-+u_int32_t  sdr_r_u32(const char *elem, SDR_stream *);
- 
- void           sdr_w_u64(const char *elem, SDR_stream *,
- 			 oc_uint64_t);
- oc_uint64_t    sdr_r_u64(const char *elem, SDR_stream *);
- 
- void           sdr_w_bytes(const char *elem, SDR_stream *,
--			   unsigned long len, const void *);
-+			   u_int32_t len, const void *);
- void *         sdr_r_bytes(const char *elem, SDR_stream *,
--			   unsigned long len);
-+			   u_int32_t len);
- 
- void           sdr_w_buffer(const char *elem, SDR_stream *, const Buffer*);
- Buffer *       sdr_r_buffer(const char *elem, SDR_stream *, ocmoff_t len);
diff --git a/devel/opencm/patches/patch-base_src_common_SSLcommon_h b/devel/opencm/patches/patch-base_src_common_SSLcommon_h
new file mode 100644
index 00000000000..2419ce94278
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_common_SSLcommon_h
@@ -0,0 +1,34 @@
+$OpenBSD: patch-base_src_common_SSLcommon_h,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/common/SSLcommon.h.orig	Mon Jul  8 16:30:58 2002
++++ base/src/common/SSLcommon.h	Wed Aug 28 14:26:40 2002
+@@ -42,12 +42,29 @@
+  */
+ 
+ #ifndef HAVE_OPENSSL
+-#error "Configure script did not locate OpenSSL"
++  #error "Configure script did not locate OpenSSL"
+ #endif
+ 
+ #include 
+ #include 
+ #include 
++
++#ifndef OPENSSL_VERSION_NUMBER
++  #error "OPENSSL_VERSION_NUMBER is not defined!"
++#endif
++
++/*
++   opensslv.h documents this format: it should match 0.9.6-dev or higher
++   versions, which seems about right. We need 0.9.6 cause PRNG.c wants
++   to use RAND_egd_bytes, which is not available in 0.9.5 or previous versions.
++
++   A couple other (older) version formats are mentioned in the header. However,
++   all of them should result in a version code less than x09060000, so we should
++   be OK.
++*/
++#if (OPENSSL_VERSION_NUMBER < 0x00906000)
++  #error "OpenSSL 0.9.6 or higher is required by OpenCM"
++#endif
+ 
+ #define BUFSIZZ 1024
+ #define SSLPORT 4433
diff --git a/devel/opencm/patches/patch-base_src_common_Serializable_c b/devel/opencm/patches/patch-base_src_common_Serializable_c
deleted file mode 100644
index f43fdb155fb..00000000000
--- a/devel/opencm/patches/patch-base_src_common_Serializable_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_Serializable_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/Serializable.c.orig	Mon Jul 29 22:48:29 2002
-+++ base/src/common/Serializable.c	Tue Aug 27 12:25:27 2002
-@@ -72,7 +72,7 @@ SerialType *serTypes[TY_ntypes] = {
- #include "OBTYPES.def"
- 
- SerialType *
--ser_find_type(unsigned long t)
-+ser_find_type(u_int32_t t)
- {
-   unsigned u;
- 
diff --git a/devel/opencm/patches/patch-base_src_common_Serializable_h b/devel/opencm/patches/patch-base_src_common_Serializable_h
deleted file mode 100644
index ff51d291439..00000000000
--- a/devel/opencm/patches/patch-base_src_common_Serializable_h
+++ /dev/null
@@ -1,34 +0,0 @@
-$OpenBSD: patch-base_src_common_Serializable_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/Serializable.h.orig	Mon Jul 29 22:48:35 2002
-+++ base/src/common/Serializable.h	Tue Aug 27 12:25:27 2002
-@@ -56,8 +56,8 @@ enum {
- typedef struct DeserializeInfo DeserializeInfo;
- struct DeserializeInfo {
-   struct SerialType *st;
--  unsigned long tyConst;	/* type constant as serialized */
--  unsigned long ver;		/* version number as serialized */
-+  u_int32_t tyConst;	/* type constant as serialized */
-+  u_int32_t ver;		/* version number as serialized */
- };
- 
- #define OBTYPE(nm,prefix,abbrev,ver) \
-@@ -76,8 +76,8 @@ struct DeserializeInfo {
-     canonicalize the internal representation before displaying the
-     object. */
- struct SerialType {
--  unsigned long typ;		/* type constant for this object */
--  unsigned long ver;		/* version constant for this object */
-+  u_int32_t typ;		/* type constant for this object */
-+  u_int32_t ver;		/* version constant for this object */
-   const char *  tyName;		/* used in texty formats */
-   const char *  prefix;         /* used as first part of truename */
-   void *        (*deserialize) (const DeserializeInfo *, SDR_stream *);
-@@ -99,7 +99,7 @@ struct Serializable {
- #define serTrueName ser.ser_trueName
- #define serPrefix ser.ser_type->prefix
- 
--SerialType *ser_find_type(unsigned long ty);
-+SerialType *ser_find_type(u_int32_t ty);
- void ser_init(void);
- 
- const char *ser_getTrueName(const void *);
diff --git a/devel/opencm/patches/patch-base_src_common_ServerRequest_h b/devel/opencm/patches/patch-base_src_common_ServerRequest_h
deleted file mode 100644
index 3b0675ab51e..00000000000
--- a/devel/opencm/patches/patch-base_src_common_ServerRequest_h
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_ServerRequest_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/ServerRequest.h.orig	Tue Jul 16 21:49:02 2002
-+++ base/src/common/ServerRequest.h	Tue Aug 27 12:25:27 2002
-@@ -41,7 +41,7 @@
-  * POSSIBILITY OF SUCH DAMAGE.
-  */
- 
--typedef unsigned long reqlen_t;
-+typedef u_int32_t reqlen_t;
- 
- typedef struct Request {
-   Serializable ser;
diff --git a/devel/opencm/patches/patch-base_src_common_TrueName_h b/devel/opencm/patches/patch-base_src_common_TrueName_h
deleted file mode 100644
index a3228edda56..00000000000
--- a/devel/opencm/patches/patch-base_src_common_TrueName_h
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_TrueName_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/TrueName.h.orig	Wed Jul 17 23:27:56 2002
-+++ base/src/common/TrueName.h	Tue Aug 27 12:25:27 2002
-@@ -49,7 +49,7 @@ const char *truename_NewName(void);
- 
- /* Generate an integer hash of the trueName suitable for use in hash
-    tables */
--typedef unsigned long tnhash_t;
-+typedef u_int32_t tnhash_t;
- 
- tnhash_t truename_hash(const char *trueName);
- 
diff --git a/devel/opencm/patches/patch-base_src_common_WireException_h b/devel/opencm/patches/patch-base_src_common_WireException_h
deleted file mode 100644
index 0dddf485e89..00000000000
--- a/devel/opencm/patches/patch-base_src_common_WireException_h
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_WireException_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/WireException.h.orig	Mon Jul  8 16:31:00 2002
-+++ base/src/common/WireException.h	Tue Aug 27 12:25:27 2002
-@@ -46,7 +46,7 @@ typedef struct WireException {
-   
-   const char *name;		/* exception  name */
-   const char *fname;		/* file where thrown (string) */
--  unsigned long line;		/* line number where thrown */
-+  u_int32_t line;		/* line number where thrown */
-   const char *str;		/* explanation string */
- } WireException;
- 
diff --git a/devel/opencm/patches/patch-base_src_common_encode_c b/devel/opencm/patches/patch-base_src_common_encode_c
deleted file mode 100644
index 8b89e2f8dbd..00000000000
--- a/devel/opencm/patches/patch-base_src_common_encode_c
+++ /dev/null
@@ -1,20 +0,0 @@
-$OpenBSD: patch-base_src_common_encode_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/encode.c.orig	Mon Jul  8 16:31:06 2002
-+++ base/src/common/encode.c	Tue Aug 27 12:25:27 2002
-@@ -127,12 +127,12 @@ b64_encode(const void *vp, unsigned int 
-   char *pBuf = outbuf;
- 
-   while (len) {
--    unsigned long take = min(len, 3);
--    unsigned long value = 0;
--    unsigned long outlen = (take * 8 + 5) / 6;
-+    u_int32_t take = min(len, 3);
-+    u_int32_t value = 0;
-+    u_int32_t outlen = (take * 8 + 5) / 6;
-     unsigned i;
- 
--    assert(sizeof(unsigned long) == 4);
-+    assert(sizeof(u_int32_t) == 4);
- 
-     if (take == 3) {
-       value = cp[2];
diff --git a/devel/opencm/patches/patch-base_src_common_except_c b/devel/opencm/patches/patch-base_src_common_except_c
deleted file mode 100644
index c5b09b7e565..00000000000
--- a/devel/opencm/patches/patch-base_src_common_except_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_except_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/except.c.orig	Mon Jul  8 16:31:09 2002
-+++ base/src/common/except.c	Tue Aug 27 12:25:27 2002
-@@ -73,7 +73,7 @@ DEFEXCEPTION(ExUnspecified, "Unspecified
- excpt_unwind *exit_unwind_list = 0;
- 
- void
--_throw(catch_t *_cb, const char *fname, unsigned long line, 
-+_throw(catch_t *_cb, const char *fname, u_int32_t line, 
-        Exception ex, const char *s)
- {
-   _curCatch = _cb;
diff --git a/devel/opencm/patches/patch-base_src_common_except_h b/devel/opencm/patches/patch-base_src_common_except_h
deleted file mode 100644
index 7f4400ab375..00000000000
--- a/devel/opencm/patches/patch-base_src_common_except_h
+++ /dev/null
@@ -1,21 +0,0 @@
-$OpenBSD: patch-base_src_common_except_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/except.h.orig	Thu Jul 18 20:30:57 2002
-+++ base/src/common/except.h	Tue Aug 27 12:25:27 2002
-@@ -57,7 +57,7 @@ struct catch {
-   jmp_buf  jbuf;		/* saved catch environment */
-   Exception excpt;		/* thrown exception value */
-   const char *fname;		/* file where thrown (string) */
--  unsigned long line;		/* line number where thrown */
-+  u_int32_t line;		/* line number where thrown */
-   const char *str;		/* explanation string */
-   catch_t  *up;			/* next (upward) catch block */
-   OC_bool caught;                  /* whether this exception was handled */
-@@ -107,7 +107,7 @@ extern catch_t *_curCatch;
-    debugger. */
- extern void _throw(catch_t *, 
- 		   const char *fname, 
--		   unsigned long line, 
-+		   u_int32_t line, 
- 		   Exception,
- 		   const char *s) __attribute__ ((__noreturn__));
- 
diff --git a/devel/opencm/patches/patch-base_src_common_rbtree_c b/devel/opencm/patches/patch-base_src_common_rbtree_c
deleted file mode 100644
index 943ea1a1f6c..00000000000
--- a/devel/opencm/patches/patch-base_src_common_rbtree_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_common_rbtree_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/rbtree.c.orig	Mon Aug  5 21:21:38 2002
-+++ base/src/common/rbtree.c	Tue Aug 27 12:25:27 2002
-@@ -99,7 +99,7 @@ rbtree_s_cmpkey(const rbnode *rn1, const
- 
- 
- rbnode *
--rbnode_create(const void *kvp, unsigned long kw, const void *data)
-+rbnode_create(const void *kvp, u_int32_t kw, const void *data)
- {
-   rbnode *rbn = GC_MALLOC(sizeof(rbnode));
-   rbn->left = TREE_NIL;
diff --git a/devel/opencm/patches/patch-base_src_common_rbtree_h b/devel/opencm/patches/patch-base_src_common_rbtree_h
deleted file mode 100644
index 3ae7decb227..00000000000
--- a/devel/opencm/patches/patch-base_src_common_rbtree_h
+++ /dev/null
@@ -1,21 +0,0 @@
-$OpenBSD: patch-base_src_common_rbtree_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/rbtree.h.orig	Mon Jul 29 22:48:43 2002
-+++ base/src/common/rbtree.h	Tue Aug 27 12:25:27 2002
-@@ -47,7 +47,7 @@
- typedef struct rbkey rbkey;
- struct rbkey {
-   const void *vp;
--  unsigned long w;
-+  u_int32_t w;
- };
- 
- /* The rbnode and rbkey structures are exposed because it is sometimes 
-@@ -103,7 +103,7 @@ int rbtree_compare_node_to_key(rbtree*, 
- int rbtree_compare_nodes(rbtree*, rbnode *, rbnode *);
- 
- /* For situations where the rbnode itself is sufficient: */
--rbnode *rbnode_create(const void *kvp, unsigned long kw, const void *data);
-+rbnode *rbnode_create(const void *kvp, u_int32_t kw, const void *data);
- 
- #ifndef NDEBUG
- /* tree_validate() -- check the subtree of ROOT rooted at NODE for
diff --git a/devel/opencm/patches/patch-base_src_common_sxdelta_c b/devel/opencm/patches/patch-base_src_common_sxdelta_c
deleted file mode 100644
index 0a6f500be22..00000000000
--- a/devel/opencm/patches/patch-base_src_common_sxdelta_c
+++ /dev/null
@@ -1,47 +0,0 @@
-$OpenBSD: patch-base_src_common_sxdelta_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/sxdelta.c.orig	Mon Aug  5 16:03:05 2002
-+++ base/src/common/sxdelta.c	Tue Aug 27 12:25:27 2002
-@@ -133,7 +133,7 @@
-    something using limits.h to choose the proper value. */
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
--typedef unsigned long uint32_t;
-+typedef u_int32_t uint32_t;
- #endif
- 
- typedef struct hashpos_t {
-@@ -597,9 +597,9 @@ emit_finish(sxdelta_t *xd)
- #define HT_SHA1  0
- 
- typedef struct xdirent_t {
--  unsigned long insOffset;	/* of start of insert pool list */
--  unsigned long cmdOffset;	/* of start of CMD list */
--  unsigned long cmdLen;		/* of CMD list */
-+  u_int32_t insOffset;	/* of start of insert pool list */
-+  u_int32_t cmdOffset;	/* of start of CMD list */
-+  u_int32_t cmdLen;		/* of CMD list */
-   unsigned const char *name;	/* entry name */
- } xdirent_t;
- 
-@@ -608,9 +608,9 @@ typedef struct XDeltaArchive_t {
-   unsigned short version;	/* currently 1 */
-   unsigned short flags;		/* currently 0 */
- 
--  unsigned long nDirent;	/* number of entries */
--  unsigned long maxDirent;	/* allocated dir space */
--  unsigned long nContent;		/* number of stored deltas */
-+  u_int32_t nDirent;	/* number of entries */
-+  u_int32_t maxDirent;	/* allocated dir space */
-+  u_int32_t nContent;		/* number of stored deltas */
-   struct xdirent_t *dir;
-   
-   Buffer *content;		/* sequence of serialized xdeltas */
-@@ -694,7 +694,7 @@ xda_rewriteWith(XDeltaArchive_t *xda, sx
-   unsigned u;
- 
-   ocmoff_t contentLen = buffer_length(xda->content);
--  unsigned long newLen = contentLen;
-+  u_int32_t newLen = contentLen;
-   newLen +=  stream_length(xd->ins);
-   newLen +=  stream_length(xd->cmd);
-   xda->nContent = newLen;
diff --git a/devel/opencm/patches/patch-base_src_common_util_c b/devel/opencm/patches/patch-base_src_common_util_c
deleted file mode 100644
index 0df73d6c322..00000000000
--- a/devel/opencm/patches/patch-base_src_common_util_c
+++ /dev/null
@@ -1,66 +0,0 @@
-$OpenBSD: patch-base_src_common_util_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/common/util.c.orig	Mon Aug  5 16:03:07 2002
-+++ base/src/common/util.c	Tue Aug 27 12:25:27 2002
-@@ -179,8 +179,8 @@ nmequal(const char *s1, const char *s2)
- size_t
- xprintf(const char *fmt, ...)
- {
--  unsigned long len;
--  unsigned long width = 0;
-+  u_int32_t len;
-+  u_int32_t width = 0;
-   OC_bool sign;
-   OC_bool rightAdjust;
-   char fillchar;
-@@ -199,7 +199,7 @@ xprintf(const char *fmt, ...)
-       continue;
-     }
- 
--    /* largest thing we might convert fits in 20 digits (unsigned long
-+    /* largest thing we might convert fits in 20 digits (u_int32_t
-      * long as decimal */
-     
-     pend = &buf[20];
-@@ -263,7 +263,7 @@ xprintf(const char *fmt, ...)
-     case 'd':
-       {
- 	long l;
--	unsigned long ul;
-+	u_int32_t ul;
- 
- 	l = va_arg(ap, long);
- 	      
-@@ -277,7 +277,7 @@ xprintf(const char *fmt, ...)
- 	  ul = (l < 0) ? (unsigned) -l : (unsigned) l;
- 
- 	  if (l == LONG_MIN)
--	    ul = ((unsigned long) LONG_MAX) + 1ul;
-+	    ul = ((u_int32_t) LONG_MAX) + 1ul;
- 
- 	  while(ul) {
- 	    *(--p) = '0' + (ul % 10);
-@@ -288,9 +288,9 @@ xprintf(const char *fmt, ...)
-       }
-     case 'u':
-       {
--	unsigned long ul;
-+	u_int32_t ul;
- 
--	ul = va_arg(ap, unsigned long);
-+	ul = va_arg(ap, u_int32_t);
- 	      
- 	if (ul == 0) {
- 	  *(--p) = '0';
-@@ -305,10 +305,10 @@ xprintf(const char *fmt, ...)
-       }
-     case 'x':
-       {
--	unsigned long ul;
-+	u_int32_t ul;
- 	static char *hex_digits = "0123456789abcdef";
- 
--	ul = va_arg(ap, unsigned long);
-+	ul = va_arg(ap, u_int32_t);
- 	      
- 	if (ul == 0) {
- 	  *(--p) = '0';
diff --git a/devel/opencm/patches/patch-base_src_common_xfopen_c b/devel/opencm/patches/patch-base_src_common_xfopen_c
new file mode 100644
index 00000000000..90ce9423b1a
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_common_xfopen_c
@@ -0,0 +1,16 @@
+$OpenBSD: patch-base_src_common_xfopen_c,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/common/xfopen.c.orig	Wed Jul 17 12:10:40 2002
++++ base/src/common/xfopen.c	Wed Aug 28 14:26:40 2002
+@@ -73,6 +73,11 @@ xfopen(const char *path, const char mode
+ void
+ xfclose(FILE *f)
+ {
++  int retval; 
+   if (f != NULL)
+-    fclose(f);
++  {
++    retval = fclose(f);
++    if(retval) /* shame we can't get the filename here... */
++      THROW(ExTruncated, format("Closing file failed, error %d\n", retval));
++  }
+ }
diff --git a/devel/opencm/patches/patch-base_src_help_bind_help b/devel/opencm/patches/patch-base_src_help_bind_help
index c46c2067a0b..21dda3472b2 100644
--- a/devel/opencm/patches/patch-base_src_help_bind_help
+++ b/devel/opencm/patches/patch-base_src_help_bind_help
@@ -1,9 +1,10 @@
+$OpenBSD: patch-base_src_help_bind_help,v 1.3 2002/08/28 22:23:29 todd Exp $
 --- base/src/help/bind.help.orig	Sun Aug  4 11:51:35 2002
-+++ base/src/help/bind.help	Tue Aug 27 12:30:49 2002
-@@ -43,5 +43,5 @@ Adds an entry in the user's directory th
++++ base/src/help/bind.help	Wed Aug 28 14:26:40 2002
+@@ -43,5 +43,4 @@ Adds an entry in the user's directory th
  In most cases @i{value} is the truename of some archived object and
  @i{key} is the more user-friendly name associated with that object.
  
 -See also:  @b{ls}, @b{mkdir}, @b{add user} @b{import}, 
-+See also:  @b{ls}, @b{mkdir}, @b{adduser} @b{import}, 
- @b{create branch}.
+-@b{create branch}.
++See also: @b{ls}, @b{mkdir}, @b{add user} @b{import}, @b{create branch}.
diff --git a/devel/opencm/patches/patch-base_src_help_create-project_help b/devel/opencm/patches/patch-base_src_help_create-project_help
new file mode 100644
index 00000000000..4366b5f5157
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_help_create-project_help
@@ -0,0 +1,51 @@
+$OpenBSD: patch-base_src_help_create-project_help,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/help/create-project.help.orig	Wed Aug 28 14:26:40 2002
++++ base/src/help/create-project.help	Wed Aug 28 14:26:40 2002
+@@ -0,0 +1,47 @@
++@C Copyright (c) 2002, The EROS Group, LLC and Johns Hopkins
++@C University. All rights reserved.
++@C 
++@C This software was developed to support the EROS secure operating
++@C system project (http://www.eros-os.org). The latest version of
++@C the OpenCM software can be found at http://www.opencm.org.
++@C 
++@C Redistribution and use in source and binary forms, with or
++@C without modification, are permitted provided that the following
++@C conditions are met:
++@C 
++@C 1. Redistributions of source code must retain the above copyright
++@C    notice, this list of conditions and the following disclaimer.
++@C 
++@C 2. Redistributions in binary form must reproduce the above
++@C    copyright notice, this list of conditions and the following
++@C    disclaimer in the documentation and/or other materials
++@C    provided with the distribution.
++@C 
++@C 3. Neither the name of the The EROS Group, LLC nor the name of
++@C    Johns Hopkins University, nor the names of its contributors
++@C    may be used to endorse or promote products derived from this
++@C    software without specific prior written permission.
++@C 
++@C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++@C CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++@C INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++@C MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++@C DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
++@C BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++@C EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++@C TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++@C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
++@C ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++@C OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++@C OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
++@C POSSIBILITY OF SUCH DAMAGE.
++@C
++@C
++@b{create project} @i{new-name}
++
++Creates a new project and a new empty branch and binds @i{new-name} to the
++new empty branch in the user's directory.  All projects are internally 
++referenced by branches and all operations are done relative to a branch. 
++Thus, you can always find the associated project name by listing any branch.
++
++See also:  @b{ls}, @b{create branch}
diff --git a/devel/opencm/patches/patch-base_src_help_gremove_help b/devel/opencm/patches/patch-base_src_help_gremove_help
index ee3c2171842..4c03dec3075 100644
--- a/devel/opencm/patches/patch-base_src_help_gremove_help
+++ b/devel/opencm/patches/patch-base_src_help_gremove_help
@@ -1,5 +1,6 @@
---- base/src/help/gremove.help.orig	Thu Aug 15 13:14:02 2002
-+++ base/src/help/gremove.help	Thu Aug 15 13:14:16 2002
+$OpenBSD: patch-base_src_help_gremove_help,v 1.2 2002/08/28 22:23:29 todd Exp $
+--- base/src/help/gremove.help.orig	Mon Jul 29 22:48:32 2002
++++ base/src/help/gremove.help	Wed Aug 28 14:26:40 2002
 @@ -41,4 +41,4 @@
  
  Removes specified @i{member} from the existing group @i{group-spec}. 
diff --git a/devel/opencm/patches/patch-base_src_help_import_help b/devel/opencm/patches/patch-base_src_help_import_help
new file mode 100644
index 00000000000..4e2a220262a
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_help_import_help
@@ -0,0 +1,12 @@
+$OpenBSD: patch-base_src_help_import_help,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/help/import.help.orig	Sun Aug  4 11:51:38 2002
++++ base/src/help/import.help	Wed Aug 28 14:26:40 2002
+@@ -44,7 +44,7 @@ files in the working directory for uploa
+ 
+ Permanent changes don't take effect until the execution of the
+ @b{commit} command.  To undo any additions, use the @b{revert}
+-command.  A new enty called @i{new-name} is created in the user's
++command.  A new entry called @i{new-name} is created in the user's
+ directory and is bound to the newly created main branch.  An entry for
+ the project name is bound within that branch.
+ 
diff --git a/devel/opencm/patches/patch-base_src_help_mv_help b/devel/opencm/patches/patch-base_src_help_mv_help
new file mode 100644
index 00000000000..3abdb64e990
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_help_mv_help
@@ -0,0 +1,49 @@
+$OpenBSD: patch-base_src_help_mv_help,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/help/mv.help.orig	Wed Aug 28 14:26:40 2002
++++ base/src/help/mv.help	Wed Aug 28 14:26:40 2002
+@@ -0,0 +1,45 @@
++@C Copyright (c) 2002, The EROS Group, LLC and Johns Hopkins
++@C University. All rights reserved.
++@C 
++@C This software was developed to support the EROS secure operating
++@C system project (http://www.eros-os.org). The latest version of
++@C the OpenCM software can be found at http://www.opencm.org.
++@C 
++@C Redistribution and use in source and binary forms, with or
++@C without modification, are permitted provided that the following
++@C conditions are met:
++@C 
++@C 1. Redistributions of source code must retain the above copyright
++@C    notice, this list of conditions and the following disclaimer.
++@C 
++@C 2. Redistributions in binary form must reproduce the above
++@C    copyright notice, this list of conditions and the following
++@C    disclaimer in the documentation and/or other materials
++@C    provided with the distribution.
++@C 
++@C 3. Neither the name of the The EROS Group, LLC nor the name of
++@C    Johns Hopkins University, nor the names of its contributors
++@C    may be used to endorse or promote products derived from this
++@C    software without specific prior written permission.
++@C 
++@C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++@C CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++@C INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++@C MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++@C DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
++@C BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++@C EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++@C TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++@C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
++@C ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++@C OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++@C OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
++@C POSSIBILITY OF SUCH DAMAGE.
++@C
++@C
++@b{mv} @i{old-fsname} @i{new-fsname}
++
++Changes the fsName for an archived object. Permanent changes only take effect
++after executing a subsequent @b{commit}.
++
++See also:  @b{commit}, @b{revert}
diff --git a/devel/opencm/patches/patch-base_src_help_rename-entity_help b/devel/opencm/patches/patch-base_src_help_rename-entity_help
new file mode 100644
index 00000000000..c8e48d985cb
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_help_rename-entity_help
@@ -0,0 +1,52 @@
+$OpenBSD: patch-base_src_help_rename-entity_help,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/help/rename-entity.help.orig	Mon Jul  8 16:32:09 2002
++++ base/src/help/rename-entity.help	Wed Aug 28 14:26:40 2002
+@@ -1,48 +0,0 @@
+-@C Copyright (c) 2002, The EROS Group, LLC and Johns Hopkins
+-@C University. All rights reserved.
+-@C 
+-@C This software was developed to support the EROS secure operating
+-@C system project (http://www.eros-os.org). The latest version of
+-@C the OpenCM software can be found at http://www.opencm.org.
+-@C 
+-@C Redistribution and use in source and binary forms, with or
+-@C without modification, are permitted provided that the following
+-@C conditions are met:
+-@C 
+-@C 1. Redistributions of source code must retain the above copyright
+-@C    notice, this list of conditions and the following disclaimer.
+-@C 
+-@C 2. Redistributions in binary form must reproduce the above
+-@C    copyright notice, this list of conditions and the following
+-@C    disclaimer in the documentation and/or other materials
+-@C    provided with the distribution.
+-@C 
+-@C 3. Neither the name of the The EROS Group, LLC nor the name of
+-@C    Johns Hopkins University, nor the names of its contributors
+-@C    may be used to endorse or promote products derived from this
+-@C    software without specific prior written permission.
+-@C 
+-@C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+-@C CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+-@C INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+-@C MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+-@C DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+-@C BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+-@C EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+-@C TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+-@C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+-@C ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+-@C OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+-@C OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-@C POSSIBILITY OF SUCH DAMAGE.
+-@C
+-@C
+-@b{rename entity} @i{old-fsname} @i{new-fsname}
+-@b{mv} @i{old-fsname} @i{new-fsname}
+-
+-Changes the fsName for an archived object.
+-
+-Permanent changes only take effect after executing
+-a subsequent @b{commit}. 
+-
+-See also:  @b{commit}, @b{revert}
diff --git a/devel/opencm/patches/patch-base_src_help_revert_help b/devel/opencm/patches/patch-base_src_help_revert_help
index 93d406f5e5a..7b512bf701b 100644
--- a/devel/opencm/patches/patch-base_src_help_revert_help
+++ b/devel/opencm/patches/patch-base_src_help_revert_help
@@ -1,5 +1,6 @@
+$OpenBSD: patch-base_src_help_revert_help,v 1.3 2002/08/28 22:23:29 todd Exp $
 --- base/src/help/revert.help.orig	Sun Aug  4 11:51:40 2002
-+++ base/src/help/revert.help	Tue Aug 27 12:30:49 2002
++++ base/src/help/revert.help	Wed Aug 28 14:26:40 2002
 @@ -43,7 +43,7 @@ Removes all modifications to a user's Wo
  the last @b{commit}.
  
diff --git a/devel/opencm/patches/patch-base_src_help_rm_help b/devel/opencm/patches/patch-base_src_help_rm_help
new file mode 100644
index 00000000000..c6043e86f92
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_help_rm_help
@@ -0,0 +1,24 @@
+$OpenBSD: patch-base_src_help_rm_help,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/help/rm.help.orig	Mon Jul 29 22:48:40 2002
++++ base/src/help/rm.help	Wed Aug 28 14:26:40 2002
+@@ -37,14 +37,13 @@
+ @C POSSIBILITY OF SUCH DAMAGE.
+ @C
+ @C
+-@b{remove file} @i{[file}}+
++@b{rm} @i{[file]}+
+ 
+-Remove one or more files from an existing project.  User's workspace 
+-specifies current (working) branch and this command must be executed 
+-within that workspace.
++Remove one or more files from an existing project.  User's workspace specifies
++current (working) branch and this command must be executed within that
++workspace.
+ 
+-Permanent changes don't take effect until the execution of the
+-@i{commit} command.  To undo any additions, use the @i{ revert}
+-command.
++Permanent changes don't take effect until the execution of the @i{commit}
++command. To undo any additions, use the @i{revert} command.
+ 
+ See also: @b{commit}, @b{add file}
diff --git a/devel/opencm/patches/patch-base_src_help_whoami_help b/devel/opencm/patches/patch-base_src_help_whoami_help
new file mode 100644
index 00000000000..168b7e06e2e
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_help_whoami_help
@@ -0,0 +1,47 @@
+$OpenBSD: patch-base_src_help_whoami_help,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/help/whoami.help.orig	Wed Aug 28 14:26:40 2002
++++ base/src/help/whoami.help	Wed Aug 28 14:26:40 2002
+@@ -0,0 +1,43 @@
++@C Copyright (c) 2002, The EROS Group, LLC and Johns Hopkins
++@C University. All rights reserved.
++@C 
++@C This software was developed to support the EROS secure operating
++@C system project (http://www.eros-os.org). The latest version of
++@C the OpenCM software can be found at http://www.opencm.org.
++@C 
++@C Redistribution and use in source and binary forms, with or
++@C without modification, are permitted provided that the following
++@C conditions are met:
++@C 
++@C 1. Redistributions of source code must retain the above copyright
++@C    notice, this list of conditions and the following disclaimer.
++@C 
++@C 2. Redistributions in binary form must reproduce the above
++@C    copyright notice, this list of conditions and the following
++@C    disclaimer in the documentation and/or other materials
++@C    provided with the distribution.
++@C 
++@C 3. Neither the name of the The EROS Group, LLC nor the name of
++@C    Johns Hopkins University, nor the names of its contributors
++@C    may be used to endorse or promote products derived from this
++@C    software without specific prior written permission.
++@C 
++@C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++@C CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++@C INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++@C MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++@C DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
++@C BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++@C EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++@C TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++@C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
++@C ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++@C OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++@C OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
++@C POSSIBILITY OF SUCH DAMAGE.
++@C
++@C
++@b{whoami}
++
++Displays some information about the current user key, particularly, the email
++address associated with that key, and it's expiration date.
diff --git a/devel/opencm/patches/patch-base_src_opencm-builddir_h b/devel/opencm/patches/patch-base_src_opencm-builddir_h
new file mode 100644
index 00000000000..58416e3004e
--- /dev/null
+++ b/devel/opencm/patches/patch-base_src_opencm-builddir_h
@@ -0,0 +1,11 @@
+$OpenBSD: patch-base_src_opencm-builddir_h,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/src/opencm-builddir.h.orig	Mon Aug  5 21:47:11 2002
++++ base/src/opencm-builddir.h	Wed Aug 28 14:26:40 2002
+@@ -43,6 +43,6 @@
+ 
+ /* Generated automatically from opencm-builddir.h.in by configure. */
+ 
+-#define CM_BUILD_PWD "/home/opencm/WORK/base"
++#define CM_BUILD_PWD "/u/todd/src/cm/DEV/base"
+ 
+ #endif /* OPENCM_BUILDDIR_H */
diff --git a/devel/opencm/patches/patch-base_src_opencm_h b/devel/opencm/patches/patch-base_src_opencm_h
deleted file mode 100644
index 4e50708c26b..00000000000
--- a/devel/opencm/patches/patch-base_src_opencm_h
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_opencm_h,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/opencm.h.orig	Mon Aug  5 16:03:07 2002
-+++ base/src/opencm.h	Tue Aug 27 12:25:27 2002
-@@ -110,7 +110,7 @@ typedef struct Repository Repository;
- typedef struct command command;
- 
- #if SIZEOF_UNSIGNED_LONG_LONG == 8
--typedef unsigned long long oc_uint64_t;
-+typedef u_int32_t long oc_uint64_t;
- #elif SIZEOF___UINT64 == 8
- typedef __uint64 oc_uint64_t;
- #error "OpenCM requires a 64-bit unsigned type."
diff --git a/devel/opencm/patches/patch-base_src_repos_fs_FSRepos_c b/devel/opencm/patches/patch-base_src_repos_fs_FSRepos_c
deleted file mode 100644
index 7f4fc148a89..00000000000
--- a/devel/opencm/patches/patch-base_src_repos_fs_FSRepos_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_repos_fs_FSRepos_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/repos/fs/FSRepos.c.orig	Mon Aug  5 20:06:47 2002
-+++ base/src/repos/fs/FSRepos.c	Tue Aug 27 12:25:27 2002
-@@ -1005,7 +1005,7 @@ fsrepos_GetMutable(Repository *r, const 
- }
- 
- static Mutable *
--fsrepos_ReviseMutable(Repository *r, const char *mURI, unsigned long
-+fsrepos_ReviseMutable(Repository *r, const char *mURI, u_int32_t
- 		      long curTopRev, void *s)
- {
-   Mutable *m = repos_GetMutable(r, mURI);
diff --git a/devel/opencm/patches/patch-base_src_repos_net_NetRepository_c b/devel/opencm/patches/patch-base_src_repos_net_NetRepository_c
deleted file mode 100644
index 81e984250d6..00000000000
--- a/devel/opencm/patches/patch-base_src_repos_net_NetRepository_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_repos_net_NetRepository_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/repos/net/NetRepository.c.orig	Mon Jul 22 02:02:48 2002
-+++ base/src/repos/net/NetRepository.c	Tue Aug 27 12:25:27 2002
-@@ -41,7 +41,7 @@
- #include 
- #include 
- 
--static unsigned long request_id = 0;
-+static u_int32_t request_id = 0;
- 
- #define make_request(x) do_make_request(OP_##x)
- static Request *
diff --git a/devel/opencm/patches/patch-base_src_server_DoRequest_c b/devel/opencm/patches/patch-base_src_server_DoRequest_c
deleted file mode 100644
index 3f7f9f7b20d..00000000000
--- a/devel/opencm/patches/patch-base_src_server_DoRequest_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_src_server_DoRequest_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/src/server/DoRequest.c.orig	Mon Jul 22 02:02:50 2002
-+++ base/src/server/DoRequest.c	Tue Aug 27 12:25:27 2002
-@@ -189,7 +189,7 @@ svr_DoRequest(Channel *c, Request *req) 
-   Reply *reply;
-   OC_bool shouldQuit = FALSE;
- 
--  static unsigned long nRequests = 0;
-+  static u_int32_t nRequests = 0;
- 
-   SDR_stream *reply_strm;
- 
diff --git a/devel/opencm/patches/patch-base_tools_cvsconvert_py b/devel/opencm/patches/patch-base_tools_cvsconvert_py
deleted file mode 100644
index 1f41cac3f14..00000000000
--- a/devel/opencm/patches/patch-base_tools_cvsconvert_py
+++ /dev/null
@@ -1,92 +0,0 @@
-$OpenBSD: patch-base_tools_cvsconvert_py,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/tools/cvsconvert.py.orig	Mon Jul 29 22:48:41 2002
-+++ base/tools/cvsconvert.py	Tue Aug 27 12:25:27 2002
-@@ -12,9 +12,9 @@ files = []
- versions = []
- commits = {}
- 
--scratch_dir = "/tmp/scratchme.$$"
-+scratch_dir = "$sd/workspace"
- co_scratchfile = "%s.%d" % ("/tmp/cvscvt-coscratch", os.getpid())
--msg_scratchfile = "/tmp/cvscvt-msgscratch.$$"
-+msg_scratchfile = "$sd/cvscvt-msgscratch.$$"
- startup_dir = os.getcwd()
- verbose = 0
- 
-@@ -202,6 +202,9 @@ class CvtSink:
-         # a branch was created and the file was immediately deleted on the
-         # branch. 
-         v.operation = "I"
-+      elif (v.state == "dead" and brstate[br] == "dead"):
-+	# I dont know why this happened, but it exists in OpenBSD cvs.
-+	v.operation = "D"
-       else:
-         raise "%s:%s: Unknown object state transition (%s -> %s)!" % (self.rcsname, v.revision, brstate[br], v.state)
-     
-@@ -554,7 +557,7 @@ class AppGui(Frame):
-     if len(adds) > 0:
-       avec = adds
-       while len(avec) > 0:
--        self.text.insert(END, "${OPENCM} --flush-io -C %s add" % scratch_dir, "CMD")
-+        self.text.insert(END, "cd %s && ${OPENCM} --flush-io add" % scratch_dir, "CMD")
-         map (lambda x, self=self: self.text.insert(END, " '%s'" % x.opencmname, "INPUT"), avec[0:10])
-         self.text.insert(END, "\n", "CMD")
-         self.text.insert(END, "checkstatus $? \"add failed\"\n", "CMD")
-@@ -563,7 +566,7 @@ class AppGui(Frame):
-     if len(deletes) > 0:
-       dvec = deletes
-       while len(dvec) > 0:
--        self.text.insert(END, "${OPENCM} --flush-io -C %s rm" % scratch_dir, "CMD")
-+        self.text.insert(END, "cd %s && ${OPENCM} --flush-io rm" % scratch_dir, "CMD")
-         map (lambda x, self=self: self.text.insert(END, " '%s'" % x.opencmname, "INPUT"), dvec[0:10])
-         self.text.insert(END, "\n", "CMD")
-         self.text.insert(END, "checkstatus $? \"remove failed\"\n", "CMD")
-@@ -578,7 +581,7 @@ class AppGui(Frame):
-     # Note: Following activity is illegal in 17 states.
-     avec = active
-     while len(avec) > 0:
--      self.text.insert(END, "${OPENCM} --flush-io -C %s --force-hash status" % scratch_dir, "CMD")
-+      self.text.insert(END, "cd %s && ${OPENCM} --flush-io --force-hash status" % scratch_dir, "CMD")
-       map (lambda x, self=self: self.text.insert(END, " %s" % x.opencmname, "INPUT"), avec[0:10])
-       self.text.insert(END, "\n", "CMD")
-       self.text.insert(END, "checkstatus $? \"status check failed\"\n", "CMD")
-@@ -593,7 +596,7 @@ class AppGui(Frame):
-     
-     # re_squote.sub("'\"'\"'", cmtmsg))
- 
--    self.text.insert(END, "${OPENCM} --flush-io -C %s commit --messagefile %s\n" %
-+    self.text.insert(END, "cd %s && ${OPENCM} --flush-io commit --messagefile %s\n" %
-                      (scratch_dir, msg_scratchfile), "CMD")
-     self.text.insert(END, "checkstatus $? \"commit failed\"\n", "CMD")
-     self.text.insert(END, "rm %s\n" % msg_scratchfile, "CMD")
-@@ -636,9 +639,11 @@ class AppGui(Frame):
- 
-     self.text.insert(END, "OPENCM=${OPENCM:-cm}\n", "CMD")
-     self.text.insert(END, "export OPENCM\n", "CMD")
-+    self.text.insert(END, "TMPDIR=${TMPDIR:-/tmp}\n", "CMD")
-+    self.text.insert(END, "sd=$(mktemp -d ${TMPDIR}/scratchme.XXXXXX)\n", "CMD")
-     self.text.insert(END, "\n")
- 
--    self.text.insert(END, "function checkstatus()\n");
-+    self.text.insert(END, "checkstatus()\n");
-     self.text.insert(END, "{\n");
-     self.text.insert(END, "  if [ $1 -ne 0 ]\n");
-     self.text.insert(END, "  then\n");
-@@ -647,7 +652,7 @@ class AppGui(Frame):
-     self.text.insert(END, "  fi\n");
-     self.text.insert(END, "}\n");
-     self.text.insert(END, "\n")
--    self.text.insert(END, "function process_cvsignore()\n");
-+    self.text.insert(END, "process_cvsignore()\n");
-     self.text.insert(END, "{\n");
-     self.text.insert(END, "  echo CONVERTING .cvsignore: $1 '->' $2\n");
-     self.text.insert(END, "  sed 's/^/exclude /' $1 > $2\n");
-@@ -660,7 +665,7 @@ class AppGui(Frame):
-     self.text.insert(END, "checkstatus $? \"create project failed\"\n", "CMD");
- 
-     self.text.insert(END, "rm -rf %s\n" % scratch_dir, "CMD")
--    self.text.insert(END, "mkdir %s\n" % scratch_dir, "CMD")
-+    self.text.insert(END, "mkdir -p %s\n" % scratch_dir, "CMD")
-     self.text.insert(END, "\n")
-     self.text.insert(END, "# Check out empty project so we have something to work with\n", "COMMENT")
-     self.text.insert(END, "(cd %s;${OPENCM} checkout %s)\n" % (scratch_dir, self.petName.get()), "CMD")
diff --git a/devel/opencm/patches/patch-base_zlib_Makefile b/devel/opencm/patches/patch-base_zlib_Makefile
new file mode 100644
index 00000000000..5c0ecb877d6
--- /dev/null
+++ b/devel/opencm/patches/patch-base_zlib_Makefile
@@ -0,0 +1,12 @@
+$OpenBSD: patch-base_zlib_Makefile,v 1.1 2002/08/28 22:23:29 todd Exp $
+--- base/zlib/Makefile.orig	Mon Aug  5 21:47:11 2002
++++ base/zlib/Makefile	Wed Aug 28 14:26:40 2002
+@@ -23,7 +23,7 @@ CFLAGS=-g
+ #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ #           -Wstrict-prototypes -Wmissing-prototypes
+ 
+-LDFLAGS=
++LDFLAGS=-L/usr/local/lib
+ LDSHARED=$(CC)
+ CPP=$(CC) -E
+ 
diff --git a/devel/opencm/patches/patch-base_zlib_gzio_c b/devel/opencm/patches/patch-base_zlib_gzio_c
deleted file mode 100644
index c5080d4dfea..00000000000
--- a/devel/opencm/patches/patch-base_zlib_gzio_c
+++ /dev/null
@@ -1,34 +0,0 @@
-$OpenBSD: patch-base_zlib_gzio_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/zlib/gzio.c.orig	Mon Jul 22 01:37:42 2002
-+++ base/zlib/gzio.c	Tue Aug 27 12:25:27 2002
-@@ -681,6 +681,7 @@ z_off_t ZEXPORT gzseek (file, offset, wh
- 	/* At this point, offset is the number of zero bytes to write. */
- 	if (s->inbuf == Z_NULL) {
- 	    s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */
-+	    if (s->inbuf == Z_NULL) return -1L;
- 	    zmemzero(s->inbuf, Z_BUFSIZE);
- 	}
- 	while (offset > 0)  {
-@@ -723,6 +724,7 @@ z_off_t ZEXPORT gzseek (file, offset, wh
- 
-     if (offset != 0 && s->outbuf == Z_NULL) {
- 	s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
-+	if (s->outbuf == Z_NULL) return -1L;
-     }
-     while (offset > 0)  {
- 	int size = Z_BUFSIZE;
-@@ -862,12 +864,13 @@ const char*  ZEXPORT gzerror (file, errn
-     *errnum = s->z_err;
-     if (*errnum == Z_OK) return (const char*)"";
- 
--    m =  (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
-+    m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
- 
-     if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err);
- 
-     TRYFREE(s->msg);
-     s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3);
-+    if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR);
-     strcpy(s->msg, s->path);
-     strcat(s->msg, ": ");
-     strcat(s->msg, m);
diff --git a/devel/opencm/patches/patch-base_zlib_zutil_c b/devel/opencm/patches/patch-base_zlib_zutil_c
deleted file mode 100644
index f3558ef5701..00000000000
--- a/devel/opencm/patches/patch-base_zlib_zutil_c
+++ /dev/null
@@ -1,12 +0,0 @@
-$OpenBSD: patch-base_zlib_zutil_c,v 1.1 2002/08/27 17:43:14 todd Exp $
---- base/zlib/zutil.c.orig	Mon Jul 22 01:37:42 2002
-+++ base/zlib/zutil.c	Tue Aug 27 12:25:27 2002
-@@ -211,6 +211,8 @@ voidpf zcalloc (opaque, items, size)
-     unsigned size;
- {
-     if (opaque) items += size - size; /* make compiler happy */
-+    if (items * size == 0)
-+	return (NULL);
-     return (voidpf)calloc(items, size);
- }
- 
diff --git a/devel/opencm/pkg/PLIST b/devel/opencm/pkg/PLIST
index 51e50c4162f..fed5ecf521c 100644
--- a/devel/opencm/pkg/PLIST
+++ b/devel/opencm/pkg/PLIST
@@ -1,4 +1,4 @@
-@comment $OpenBSD: PLIST,v 1.1.1.1 2002/08/27 16:46:09 todd Exp $
+@comment $OpenBSD: PLIST,v 1.2 2002/08/28 22:23:29 todd Exp $
 bin/cm
 share/opencm/help/add.help
 share/opencm/help/adduser.help
@@ -24,7 +24,6 @@ share/opencm/help/opt-basic.help
 share/opencm/help/opt-obscure.help
 share/opencm/help/opt-server.help
 share/opencm/help/rebind.help
-share/opencm/help/rename-entity.help
 share/opencm/help/revert.help
 share/opencm/help/revoke.help
 share/opencm/help/rm.help