Index: htags/src2html.c
===================================================================
RCS file: /sources/global/global/htags/src2html.c,v
retrieving revision 1.51
diff -u -p -r1.51 src2html.c
--- htags/src2html.c	23 Aug 2006 11:41:36 -0000	1.51
+++ htags/src2html.c	24 Aug 2006 15:16:01 -0000
@@ -722,10 +722,41 @@ src2html(const char *src, const char *ht
         fputs(fill_anchor(indexlink, src), out);
 	if (cvsweb_url) {
 		STATIC_STRBUF(sb);
+		const char *basename;
+		STATIC_STRBUF(dir);
+		static char prev_dir[MAXPATHLEN+1];
+		STATIC_STRBUF(module);
 
 		strbuf_clear(sb);
 		strbuf_puts(sb, cvsweb_url);
-		encode(sb, src);
+		strbuf_clear(dir);
+		basename = locatestring(src, "/", MATCH_LAST);
+		if (basename != NULL) {
+			strbuf_nputs(dir, src, basename - src);
+			basename++;
+		} else {
+			strbuf_putc(dir, '.');
+			basename = src;
+		}
+		if (strcmp(strbuf_value(dir), prev_dir) != 0) {
+			FILE *ip;
+
+			strlimcpy(prev_dir, strbuf_value(dir), sizeof(prev_dir));
+			strbuf_puts(dir, "/CVS/Repository");
+			strbuf_clear(module);
+			ip = fopen(strbuf_value(dir), "r");
+			if (ip != NULL) {
+				strbuf_fgets(module, ip, STRBUF_NOCRLF);
+				fclose(ip);
+			}
+		}
+		if (strbuf_getlen(module) > 0) {
+			encode(sb, strbuf_value(module));
+			strbuf_putc(sb, '/');
+			encode(sb, basename);
+		} else {
+			encode(sb, src);
+		}
 		if (cvsweb_cvsroot) {
 			strbuf_puts(sb, "?cvsroot=");
 			strbuf_puts(sb, cvsweb_cvsroot);
