From owner-svn-src-svnadmin@FreeBSD.ORG Fri Sep 14 13:41:50 2012 Return-Path: Delivered-To: svn-src-svnadmin@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7B586106566C; Fri, 14 Sep 2012 13:41:50 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 67C5C8FC1A; Fri, 14 Sep 2012 13:41:50 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q8EDfoDp032648; Fri, 14 Sep 2012 13:41:50 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q8EDfopJ032645; Fri, 14 Sep 2012 13:41:50 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201209141341.q8EDfopJ032645@svn.freebsd.org> From: John Baldwin Date: Fri, 14 Sep 2012 13:41:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-svnadmin@freebsd.org X-SVN-Group: svnadmin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r240498 - svnadmin/conf X-BeenThere: svn-src-svnadmin@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the admin / configuration tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Sep 2012 13:41:50 -0000 Author: jhb Date: Fri Sep 14 13:41:49 2012 New Revision: 240498 URL: http://svn.freebsd.org/changeset/base/240498 Log: Please welcome Peter Jeremy (peterj@) as a new src committer. Greg Lehey and I will serve as co-mentors. Approved by: core Modified: svnadmin/conf/access svnadmin/conf/mentors Modified: svnadmin/conf/access ============================================================================== --- svnadmin/conf/access Fri Sep 14 13:14:48 2012 (r240497) +++ svnadmin/conf/access Fri Sep 14 13:41:49 2012 (r240498) @@ -191,6 +191,7 @@ olli pb peadar peter peter@wemm.org +peterj pfg phantom philip Modified: svnadmin/conf/mentors ============================================================================== --- svnadmin/conf/mentors Fri Sep 14 13:14:48 2012 (r240497) +++ svnadmin/conf/mentors Fri Sep 14 13:41:49 2012 (r240498) @@ -27,6 +27,7 @@ miwi rwatson mjg trasz monthadar adrian nork imp +peterj jhb Co-mentor: grog ray adrian snb dwmalone sson gnn From owner-svn-src-svnadmin@FreeBSD.ORG Sat Sep 15 18:00:35 2012 Return-Path: Delivered-To: svn-src-svnadmin@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D8370106566B; Sat, 15 Sep 2012 18:00:34 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C2F378FC12; Sat, 15 Sep 2012 18:00:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q8FI0Yd2001111; Sat, 15 Sep 2012 18:00:34 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q8FI0Y4k001109; Sat, 15 Sep 2012 18:00:34 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201209151800.q8FI0Y4k001109@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Sat, 15 Sep 2012 18:00:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-svnadmin@freebsd.org X-SVN-Group: svnadmin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r240534 - svnadmin/tools/svnssh X-BeenThere: svn-src-svnadmin@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the admin / configuration tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Sep 2012 18:00:35 -0000 Author: bz Date: Sat Sep 15 18:00:34 2012 New Revision: 240534 URL: http://svn.freebsd.org/changeset/base/240534 Log: Use SVN access files rather than CVS. At least doc is no longer exported to CVS so new committers did not gain access. Use a defined length for username (not ideal but better than 32). Consistently use username and not pw->pw_name. Close the password database files to ensure we cannot access them any more after copy. Factor out reading access files for karma into a function; no longer allow open to fail. Put #ifdef checks around all three file reads, not just the extra two. Move karma variable initializations to just before needed. Modified: svnadmin/tools/svnssh/svnssh.c Modified: svnadmin/tools/svnssh/svnssh.c ============================================================================== --- svnadmin/tools/svnssh/svnssh.c Sat Sep 15 17:47:44 2012 (r240533) +++ svnadmin/tools/svnssh/svnssh.c Sat Sep 15 18:00:34 2012 (r240534) @@ -31,9 +31,8 @@ #define SVNROOT "/s/svn" #define BASEACCESS SVNROOT "/base/conf/access" -/* Access cvs access files over nfs for now */ -#define DOCACCESS "/home/dcvs/CVSROOT/access" -#define PORTSACCESS "/home/pcvs/CVSROOT/access" +#define DOCACCESS SVNROOT "/doc/conf/access" +#define PORTSACCESS SVNROOT "/ports/conf/access" #define NOCOMMIT "/etc/nocommit" @@ -44,7 +43,7 @@ static const char *env[] = { NULL }; -static char username[32]; +static char username[_SC_LOGIN_NAME_MAX + 1]; static char linebuf[1024]; static void @@ -61,6 +60,7 @@ msg(const char *fmt, ...) static void usage(void) { + msg("Only the \"svnserve -t\" command is available."); exit(1); } @@ -80,7 +80,7 @@ shell(char *argv[], int interactive) } static int -karmacheck(FILE *fp, char *name) +karmacheck(FILE *fp, const char *name) { char buf[1024]; char *p, *s; @@ -107,6 +107,26 @@ karmacheck(FILE *fp, char *name) return karma; } +static int +read_access(const char *accessf, const char *name) +{ + FILE *fp; + int karma; + + karma = 0; + /* Must not fail. */ + fp = fopen(accessf, "r"); + if (fp == NULL) { + msg("Cannot open %s", accessf); + exit(1); + } else { + karma = karmacheck(fp, name); + fclose(fp); + } + + return (karma); +} + int main(int argc, char *argv[]) { @@ -119,12 +139,9 @@ main(int argc, char *argv[]) gid_t repogid; gid_t mygroups[NGROUPS_MAX]; int ngroups; - int karma; - int shellkarma; + int karma, shellkarma; umask(002); - karma = 0; - shellkarma = 0; openlog("svnssh", LOG_PID | LOG_NDELAY, LOG_AUTH); pw = getpwuid(getuid()); if (pw == NULL) { @@ -136,9 +153,11 @@ main(int argc, char *argv[]) exit(1); } - /* save in a static buffer */ + /* Save in a static buffer. */ strlcpy(username, pw->pw_name, sizeof(username)); + endpwent(); + shellkarma = 0; ngroups = getgroups(NGROUPS_MAX, mygroups); if (ngroups > 0) { gr = getgrnam("shell"); @@ -191,27 +210,15 @@ main(int argc, char *argv[]) exit(1); } - fp = fopen(BASEACCESS, "r"); - if (fp == NULL) { - msg("Cannot open %s", BASEACCESS); - exit(1); - } else { - karma += karmacheck(fp, pw->pw_name); - fclose(fp); - } + karma = 0; +#ifdef BASEACCESS + karma += read_access(BASEACCESS, username); +#endif #ifdef DOCACCESS - /* Allow for failures due to NFS */ - if ((fp = fopen(DOCACCESS, "r")) != NULL) { - karma += karmacheck(fp, pw->pw_name); - fclose(fp); - } + karma += read_access(DOCACCESS, username); #endif #ifdef PORTSACCESS - /* Allow for failures due to NFS */ - if ((fp = fopen(PORTSACCESS, "r")) != NULL) { - karma += karmacheck(fp, pw->pw_name); - fclose(fp); - } + karma += read_access(PORTSACCESS, username); #endif if (karma > 0) { From owner-svn-src-svnadmin@FreeBSD.ORG Sat Sep 15 18:26:11 2012 Return-Path: Delivered-To: svn-src-svnadmin@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 76868106564A; Sat, 15 Sep 2012 18:26:11 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 618718FC0A; Sat, 15 Sep 2012 18:26:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q8FIQBPD005178; Sat, 15 Sep 2012 18:26:11 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q8FIQBx4005175; Sat, 15 Sep 2012 18:26:11 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201209151826.q8FIQBx4005175@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Sat, 15 Sep 2012 18:26:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-svnadmin@freebsd.org X-SVN-Group: svnadmin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r240535 - svnadmin/hooks/scripts X-BeenThere: svn-src-svnadmin@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the admin / configuration tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Sep 2012 18:26:11 -0000 Author: bz Date: Sat Sep 15 18:26:09 2012 New Revision: 240535 URL: http://svn.freebsd.org/changeset/base/240535 Log: As an intermediate step to unify checkacl, check for a base (src) specific version as we do for doc and ports currently. Add an extra argument, which is currently ignored for base, stating that it is a request for a commit to base. Modified: svnadmin/hooks/scripts/env.sh Modified: svnadmin/hooks/scripts/env.sh ============================================================================== --- svnadmin/hooks/scripts/env.sh Sat Sep 15 18:00:34 2012 (r240534) +++ svnadmin/hooks/scripts/env.sh Sat Sep 15 18:26:09 2012 (r240535) @@ -4,6 +4,8 @@ PATH=/s/svn/base/hooks/scripts:/usr/bin: export PATH cd /s/svn/base umask 002 -if [ -x /usr/local/bin/checkacl ]; then - eval `/usr/local/bin/checkacl` +if [ -x /usr/local/bin/checkacl-base ]; then + eval `/usr/local/bin/checkacl-base base` +elif [ -x /usr/local/bin/checkacl ]; then + eval `/usr/local/bin/checkacl base` fi From owner-svn-src-svnadmin@FreeBSD.ORG Sat Sep 15 18:34:13 2012 Return-Path: Delivered-To: svn-src-svnadmin@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 2D362106566B; Sat, 15 Sep 2012 18:34:13 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 18C9B8FC08; Sat, 15 Sep 2012 18:34:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q8FIYCdf006531; Sat, 15 Sep 2012 18:34:12 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q8FIYCH4006529; Sat, 15 Sep 2012 18:34:12 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201209151834.q8FIYCH4006529@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Sat, 15 Sep 2012 18:34:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-svnadmin@freebsd.org X-SVN-Group: svnadmin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r240536 - svnadmin/tools/checkacl X-BeenThere: svn-src-svnadmin@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the admin / configuration tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Sep 2012 18:34:13 -0000 Author: bz Date: Sat Sep 15 18:34:12 2012 New Revision: 240536 URL: http://svn.freebsd.org/changeset/base/240536 Log: Install checkacl as checkacl-base, like done for doc and ports. This is the more specific in env.sh as of r240535. Modified: svnadmin/tools/checkacl/Makefile Modified: svnadmin/tools/checkacl/Makefile ============================================================================== --- svnadmin/tools/checkacl/Makefile Sat Sep 15 18:26:09 2012 (r240535) +++ svnadmin/tools/checkacl/Makefile Sat Sep 15 18:34:12 2012 (r240536) @@ -1,6 +1,7 @@ # $FreeBSD$ -PROG= checkacl +PROG= checkacl-base +SRCS= checkacl.c NO_MAN= too bad NO_SHARED=yes DESTDIR=/usr/local/bin From owner-svn-src-svnadmin@FreeBSD.ORG Sat Sep 15 19:17:20 2012 Return-Path: Delivered-To: svn-src-svnadmin@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3FB10106566B; Sat, 15 Sep 2012 19:17:20 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 29B6B8FC0C; Sat, 15 Sep 2012 19:17:20 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q8FJHK8J014191; Sat, 15 Sep 2012 19:17:20 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q8FJHJ3p014189; Sat, 15 Sep 2012 19:17:19 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201209151917.q8FJHJ3p014189@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Sat, 15 Sep 2012 19:17:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-svnadmin@freebsd.org X-SVN-Group: svnadmin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r240538 - svnadmin/tools/checkacl X-BeenThere: svn-src-svnadmin@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the admin / configuration tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Sep 2012 19:17:20 -0000 Author: bz Date: Sat Sep 15 19:17:19 2012 New Revision: 240538 URL: http://svn.freebsd.org/changeset/base/240538 Log: Start synchronizing checkacl.c between various SVN repositories. Stop using CVS access files and use the SVN versions. Use a defined length for user named (not ideal but better than 32). Rather than using a variable per repo and karma, use two bitfields. Factor out repeated tasks, as checking an access file and adding the string for another foreign commit bit. Use #ifdef checks for all files, not just docs and ports. base is not special. Defer variable initialization to when needed. Accept a mandatory argument, the repo name, to allow code sharing between the repositories of all shared access files. Consistently use the 'username' and not pw_name after copy; close the password database to avoid further access. Inspired by: ports version from beat Modified: svnadmin/tools/checkacl/checkacl.c Modified: svnadmin/tools/checkacl/checkacl.c ============================================================================== --- svnadmin/tools/checkacl/checkacl.c Sat Sep 15 18:53:00 2012 (r240537) +++ svnadmin/tools/checkacl/checkacl.c Sat Sep 15 19:17:19 2012 (r240538) @@ -4,6 +4,8 @@ * FreeBSD Subversion tree ACL check helper. The program looks in * relevant access files to find out if the committer may commit. * + * !!! Please keep in sync between various SVN repositories. !!! + * * From: Id: cvssh.c,v 1.38 2008/05/31 02:54:58 peter Exp * $FreeBSD$ */ @@ -24,13 +26,16 @@ #include #include -#define ACCESS "/s/svn/base/conf/access" -#define DOCACCESS "/home/dcvs/CVSROOT/access" -#define PORTSACCESS "/home/pcvs/CVSROOT/access" - +#define BASE 0x01 +#define DOC 0x02 +#define PORTS 0x04 + +#define SVNROOT "/s/svn" +#define BASEACCESS SVNROOT "/base/conf/access" +#define DOCACCESS SVNROOT "/doc/conf/access" +#define PORTSACCESS SVNROOT "/ports/conf/access" -static char username[32]; -static char committag[256]; +static char username[_SC_LOGIN_NAME_MAX + 1]; static void msg(const char *fmt, ...) @@ -43,12 +48,12 @@ msg(const char *fmt, ...) va_end(ap); } -static int -karmacheck(FILE *fp, char *name) +static u_int +karmacheck(FILE *fp, const char *name, u_int k) { char buf[1024]; char *p, *s; - int karma; + u_int karma; karma = 0; while ((p = fgets(buf, sizeof(buf) - 1, fp)) != NULL) { @@ -58,11 +63,11 @@ karmacheck(FILE *fp, char *name) if (*s == '#' || *s == '/' || *s == ';') break; /* comment */ if (strcmp(s, "*") == 0) { /* all */ - karma++; + karma |= k; break; } if (strcmp(s, name) == 0) { - karma++; + karma |= k; break; } break; /* ignore further tokens on line */ @@ -71,34 +76,49 @@ karmacheck(FILE *fp, char *name) return karma; } +static u_int +read_access(const char *accessf, const u_int repo, u_int k, + const char *name) +{ + FILE *fp; + u_int karma; + + karma = 0; + fp = fopen(accessf, "r"); + if (fp == NULL && (repo & k) == k) { + msg("Cannot open %s", accessf); + exit(1); + } else if (fp != NULL) { + karma |= karmacheck(fp, name, k); + fclose(fp); + } + + return (karma); +} + +static void +catcommittag(char *committag, const char **comma, const u_int karma, + const u_int k, const char *s) +{ + + if ((karma & k) == 0) + return; + + strcat(committag, *comma); + strcat(committag, s); + *comma = ","; +} + int main(int argc, char *argv[]) { struct passwd *pw; struct stat st; - FILE *fp; - int i; gid_t repogid; gid_t mygroups[NGROUPS_MAX]; - int ngroups; - int writeable; - int karma; -#ifdef PORTSACCESS - int portskarma; -#endif -#ifdef DOCACCESS - int dockarma; -#endif - const char *comma; + int i, ngroups, writeable; + u_int karma, repo; -#ifdef PORTSACCESS - portskarma = 0; -#endif -#ifdef DOCACCESS - dockarma = 0; -#endif - karma = 0; - writeable = 0; pw = getpwuid(getuid()); if (pw == NULL) { msg("no user for uid %d", getuid()); @@ -109,11 +129,12 @@ main(int argc, char *argv[]) exit(1); } - /* save in a static buffer */ + /* Save in a static buffer. */ strlcpy(username, pw->pw_name, sizeof(username)); + endpwent(); - if (stat("/s/svn", &st) < 0) { - msg("Cannot stat %s", "/s/svn"); + if (stat(SVNROOT, &st) < 0) { + msg("Cannot stat %s", SVNROOT); exit(1); } repogid = st.st_gid; @@ -121,6 +142,7 @@ main(int argc, char *argv[]) msg("unsafe repo gid %d\n", repogid); exit(1); } + writeable = 0; ngroups = getgroups(NGROUPS_MAX, mygroups); if (ngroups > 0) { for (i = 0; i < ngroups; i++) @@ -130,54 +152,48 @@ main(int argc, char *argv[]) if (!writeable) printf("export SVN_READONLY=y\n"); - fp = fopen(ACCESS, "r"); - if (fp == NULL) { - msg("Cannot open %s", ACCESS); + if (argc != 2) { + msg("No repository given"); exit(1); - } else { - karma += karmacheck(fp, pw->pw_name); - fclose(fp); } -#ifdef DOCACCESS - if (karma == 0 && (fp = fopen(DOCACCESS, "r")) != NULL) { - dockarma += karmacheck(fp, pw->pw_name); - fclose(fp); - } -#endif -#ifdef PORTSACCESS - if (karma == 0 && (fp = fopen(PORTSACCESS, "r")) != NULL) { - portskarma += karmacheck(fp, pw->pw_name); - fclose(fp); + repo = 0; + /* Forward compat for base. */ + if (strcmp(argv[1], "base") == 0 || strcmp(argv[1], "src") == 0) + repo |= BASE; + else if (strcmp(argv[1], "doc") == 0) + repo |= DOC; + else if (strcmp(argv[1], "ports") == 0) + repo |= PORTS; + else { + msg("Invalid repository given: %s", argv[1]); + exit(1); } -#endif - if (karma == 0) { - strcpy(committag, "SVN_COMMIT_ATTRIB="); - comma = ""; + karma = 0; +#ifdef BASEACCESS + karma |= read_access(BASEACCESS, repo, BASE, username); +#endif #ifdef DOCACCESS - if (dockarma > 0) { - strcat(committag, comma); - strcat(committag, "doc"); - comma = ","; - karma += dockarma; - } + karma |= read_access(DOCACCESS, repo, DOC, username); #endif #ifdef PORTSACCESS - if (portskarma > 0) { - strcat(committag, comma); - strcat(committag, "ports"); - comma = ","; - karma += portskarma; - } + karma |= read_access(PORTSACCESS, repo, PORTS, username); #endif - if (karma != 0) { - printf("export %s\n", committag); - } - } - if (karma == 0) { /* If still zero, its a readonly access */ printf("export SVN_READONLY=y\n"); + + } else if ((repo & karma) == 0) { + char committag[sizeof("src,doc,ports") + 1]; + const char *comma; + + committag[0] = '\0'; + comma = ""; + catcommittag(committag, &comma, karma, BASE, "src"); + catcommittag(committag, &comma, karma, DOC, "doc"); + catcommittag(committag, &comma, karma, PORTS, "ports"); + printf("export SVN_COMMIT_ATTRIB=\"%s\"\n", committag); } + return (0); }