summaryrefslogtreecommitdiff
path: root/www-misc/mergelog
diff options
context:
space:
mode:
Diffstat (limited to 'www-misc/mergelog')
-rw-r--r--www-misc/mergelog/Manifest7
-rw-r--r--www-misc/mergelog/files/mergelog-4.5-asneeded.patch32
-rw-r--r--www-misc/mergelog/files/mergelog-4.5-splitlog.patch384
-rw-r--r--www-misc/mergelog/mergelog-4.5-r2.ebuild25
-rw-r--r--www-misc/mergelog/metadata.xml11
5 files changed, 459 insertions, 0 deletions
diff --git a/www-misc/mergelog/Manifest b/www-misc/mergelog/Manifest
new file mode 100644
index 000000000000..fa164ab97415
--- /dev/null
+++ b/www-misc/mergelog/Manifest
@@ -0,0 +1,7 @@
+AUX mergelog-4.5-asneeded.patch 1106 SHA256 eb7b0df76642cfa1c93dcabaff48388c7051b517aa6e48137af7f2876c491db2 SHA512 88c6e44645b41d84e67e4973dede40e550ea64b8d98490eed4c55b8240e3cecbedcf6697b5b73264e5358f3c4eea11cf2534f9588c0bf638d288678e60f8f5fa WHIRLPOOL 32c8f50d069fb05de575d6d9f86c3628ee23f0684d15798c5d536300fa407f9db64470475ac277b32b50739dc77b14d63b16843480a904a48e5b396a72183bba
+AUX mergelog-4.5-splitlog.patch 13678 SHA256 904df097cb884fe497440dbd9a967d933490861552e45bc62afa0feabe0664f5 SHA512 1d3b104e0ea27e41227cf903196a1cdbd4f362a85f9aabe95ea2a648dcc3db5378dc0a64c06b406237c88db91ac8cd63b73bce32de3a80bd44b14f5cf24de803 WHIRLPOOL a7f4840a6a0ad419cc8cb1d91b1507398205f56b1c2e5b4c22bde4331026db5b4eed8414e29dda17e3a59bc0181c5404a17b649b4d8626cdd8e01f49b45e8c67
+DIST mergelog-4.5.tar.gz 39407 SHA256 fd97c5b9ae88fbbf57d3be8d81c479e0df081ed9c4a0ada48b1ab8248a82676d SHA512 f2259cb8981871c1f9d7cadc5414997789aa13eed0e18701673ffbddedc74954e137e282c1357cafaf515e18b39e256f890ec31568a305feefa1089a9347991f WHIRLPOOL 2c4382a3787c47ae5375492850fdb7cefff225537d4331fed2f97bdec76df6f324afae4888c341923709e9ea2b89199df6376ab5d738de974892dddaa722be2a
+EBUILD mergelog-4.5-r2.ebuild 553 SHA256 974d5dd6192db1c1792e28b5e880c3b02d93188abbce2a79fb13bb75b0f7a153 SHA512 c88404e2cb413c57f6802756c31d4b53d4073df9e68735b9bd78004f00e1991cdb283648f8e570db48c6c23fec613d3bb52c342fc39f31b7d4b5f018d385c595 WHIRLPOOL e6f9eee2b8330866f8bdb4369d0020f3c0c6b1ccb889dda731c76eeae92b784594081034ad820942dd647d9444d26dd9607008556d171fe329159b760d4744a8
+MISC ChangeLog 2601 SHA256 574d76de89d2f154f5459bb3c1fae45f71cfe5afa86412f1a1f8eca9a237d6e4 SHA512 3ef4a10cdf2a1a1460332543dc1a14047e1b82519969a9081bc2fd7a9a64fe968927fd78586a5bccc20e3c2f215d45b0c10003c54817e159a8c80e9b36b97394 WHIRLPOOL db21c7bfe3be3acaa95e051d5f1dd787bd3be75a81f7db96d3c9557b766e8647da0cb057837b9f6c318967b6d538355381e1e5275934c7554974e997ff0e5650
+MISC ChangeLog-2015 3047 SHA256 a98fda3528f547f7614e855e58764a8271910ae5fe372a6bf3996ad1d5255ba0 SHA512 69b2f1e08b3637493e343eaf46021f760aef7f77a3a4abcb11869cd40e5c03bb355fc0e2bc7a8deeba48f0674aca14ba3f3e96d281c8fccc07eec8d1bbb54cd6 WHIRLPOOL d27b33d91651db412bc28db02e7add8b06aa931c03bfcd20d2bdd0db442c17357e639d97616dcea2d2369e43017f167937d58649caf3a3de5a50fd7a7a1f7ed4
+MISC metadata.xml 588 SHA256 085e6bfba30e2b608b11003985f05e348dedf95cde60778d0fc589e401dc23d9 SHA512 8301f5e4da25f389e6d3c26bad59c5170c6f971f56b79cd62786cb6fba287e9b3d865f648c04ae4ab22a40fb2815ca69ad36afd917b92d0bab97cd75cbfa41ca WHIRLPOOL 4972ddaaccd71d0efad6b0937fd7512b5ee9f106e620ce941b3d43e10b269feef1dcfb7d100a37dc8c74bada9e90addb497e0c908fe4719d42d22a907e6992eb
diff --git a/www-misc/mergelog/files/mergelog-4.5-asneeded.patch b/www-misc/mergelog/files/mergelog-4.5-asneeded.patch
new file mode 100644
index 000000000000..77573cc60f9e
--- /dev/null
+++ b/www-misc/mergelog/files/mergelog-4.5-asneeded.patch
@@ -0,0 +1,32 @@
+Index: mergelog-4.5/configure.in
+===================================================================
+--- mergelog-4.5.orig/configure.in
++++ mergelog-4.5/configure.in
+@@ -10,6 +10,7 @@ AC_PROG_INSTALL()
+
+ dnl Checks for programs.
+ AC_PROG_CC
++AM_PROG_CC_C_O
+
+ dnl Checks for libraries.
+ dnl Replace `main' with a function in -lz:
+Index: mergelog-4.5/src/Makefile.am
+===================================================================
+--- mergelog-4.5.orig/src/Makefile.am
++++ mergelog-4.5/src/Makefile.am
+@@ -1,7 +1,10 @@
+ bin_PROGRAMS=mergelog zmergelog
+
+-mergelog: mergelog.c
+- $(COMPILE) $(LIBS) -DVERSION=\"$(VERSION)\" -Wall mergelog.c -o $@
+-
+-zmergelog: mergelog.c
+- $(COMPILE) $(LIBS) -DVERSION=\"$(VERSION)\" -Wall -DUSE_ZLIB mergelog.c -o $@
++# This is a bit of a hack, but it preserves the original design of the
++# upstream Makefile.am in assuming that $VERSION will be defined in the
++# Makefile that is actually fed to make.
++AM_CPPFLAGS=-DVERSION=\"@VERSION@\"
++AM_CFLAGS=-Wall
++mergelog_SOURCES = mergelog.c
++zmergelog_SOURCES = mergelog.c
++zmergelog_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_ZLIB
diff --git a/www-misc/mergelog/files/mergelog-4.5-splitlog.patch b/www-misc/mergelog/files/mergelog-4.5-splitlog.patch
new file mode 100644
index 000000000000..ddc0348543be
--- /dev/null
+++ b/www-misc/mergelog/files/mergelog-4.5-splitlog.patch
@@ -0,0 +1,384 @@
+Index: mergelog-4.5/configure.in
+===================================================================
+--- mergelog-4.5.orig/configure.in
++++ mergelog-4.5/configure.in
+@@ -2,7 +2,7 @@ dnl Process this file with autoconf to p
+ AC_INIT(src/mergelog.c)
+
+ PACKAGE=mergelog
+-VERSION=4.5
++VERSION=4.5-split
+ AM_INIT_AUTOMAKE($PACKAGE,$VERSION,nosubst)
+
+ AC_ARG_PROGRAM
+Index: mergelog-4.5/man/mergelog.1
+===================================================================
+--- mergelog-4.5.orig/man/mergelog.1
++++ mergelog-4.5/man/mergelog.1
+@@ -1,8 +1,9 @@
+-.TH MERGELOG 1 "22 Jan 2001"
++.TH MERGELOG 1 "20 Jun 2001"
+ .SH NAME
+ mergelog \- a fast tool to merge http log files by date
+ .SH SYNOPSIS
+ .B mergelog
++.IR [-vh]\ [-o\ outfmt]
+ .IR logfile1
+ .IR logfile2 \ ...
+ .SH DESCRIPTION
+Index: mergelog-4.5/man/zmergelog.1
+===================================================================
+--- mergelog-4.5.orig/man/zmergelog.1
++++ mergelog-4.5/man/zmergelog.1
+@@ -1,8 +1,9 @@
+-.TH ZMERGELOG 1 "22 Jan 2001"
++.TH ZMERGELOG 1 "20 Jun 2001"
+ .SH NAME
+ zmergelog \- a fast tool to merge gzipped http log files by date
+ .SH SYNOPSIS
+ .B zmergelog
++.IR [-vh]\ [-o\ outfmt]
+ .IR logfile1
+ .IR logfile2 \ ...
+ .SH DESCRIPTION
+Index: mergelog-4.5/src/mergelog.c
+===================================================================
+--- mergelog-4.5.orig/src/mergelog.c
++++ mergelog-4.5/src/mergelog.c
+@@ -45,12 +45,16 @@
+ #define mygets(a,b,c,d) fast_gzgets(a,b,c,d)
+ #define myrewind gzrewind
+ #define myclose gzclose
++#define mywrite(f,b,l) gzwrite((f),(b),(l))
++#define MYSUFFIX ".gz"
+ #else
+ #define myFH FILE
+ #define myopen fopen
+ #define mygets(a,b,c,d) fgets(a,b,c)
+ #define myrewind rewind
+ #define myclose fclose
++#define mywrite(f,b,l) fwrite((b),1,(l),(f))
++#define MYSUFFIX
+ #endif
+
+
+@@ -112,20 +116,141 @@ int main (int argc, char *argv[]) {
+ char *trans_digits[60];
+ char *trans_year[200];
+ char months[24]="anebarprayunulugepctovec";
++ int goc;
++ int goUsage = 0, goVerbose = 0;
++ const char* goOutput = NULL;
++ const char* argv0 = *argv;
++ struct tm gotmFlags;
++ const char* goOutPtr;
++ myFH *outFile = NULL;
++ char outFileName[512];
++ struct tm outFileTM;
++ char outFileNewName[512];
++ size_t outBytes;
++
++ while((goc=getopt(argc,argv,"vho:"))!=-1) {
++ switch(goc) {
++ case 'h': /* -h print usage */
++ goUsage++;
++ break;
++ case 'v': /* -v verbose */
++ goVerbose++;
++ break;
++ case 'o': /* -o fmt output specification */
++ goOutput = optarg;
++ break;
++ default: /* whatever.. but we better print out usage */
++ goUsage++;
++ break;
++ }
++ }
++ argv = &argv[optind];
++ argc -= optind;
+
+- /*
+- print usage if necessary
+- */
+- if (argc == 1) {
+- fprintf(stderr,"usage: %s logfile1 logfile2 ...\nmergelog %s Copyright (C) 2000-2001 Bertrand Demiddelaer\n",argv[0],VERSION);
++ if(argc<1)
++ goUsage++;
++ if(goUsage) {
++ printf(
++ "mergelog " VERSION " Copyright (c) 2000-2001 Bertrand Demiddelaer\n\n"
++ "I have at least %d reason(s) for lending you a helping hand on using the program.\n\n"
++ "Usage: %s [-vh] [-o fmt] logfile1 logfile2 ..\n\n"
++ " -h Print this message\n"
++ " -v Increase verbosity\n"
++ " -o Give template for output file name to write log to\n"
++ " instead of standard output in strftime(3) form.\n"
++ " ( eg. -o %%Y-%%m-%%d-access.log" MYSUFFIX ")\n",
++ goUsage,argv0);
+ exit(1);
+ }
+
++ /* Analyze output format if given. It's better than trying to
++ * regenerate file name and compare it to the filename currently being
++ * written each time we want to dump one line. */
++ if(goOutput) {
++ memset(&gotmFlags,0,sizeof(gotmFlags));
++ for(goOutPtr=goOutput;*goOutPtr;goOutPtr++) {
++ if( (*goOutPtr=='%') && goOutPtr[1]) {
++ switch(*(++goOutPtr)) {
++ case 'a': /* abbreviated weekday */
++ case 'A': /* full weekday */
++ case 'u': /* day of week number */
++ case 'w': /* zerobased weekday number */
++ gotmFlags.tm_wday = 1;
++ break;
++ case 'b': /* abbreviated month */
++ case 'h': /* %b */
++ case 'B': /* full month */
++ case 'm': /* month number */
++ gotmFlags.tm_mon = 1;
++ break;
++ case 'C': /* century */
++ case 'y': /* centuryless year */
++ case 'Y': /* year with a century */
++ gotmFlags.tm_year = 1;
++ break;
++ case 'd': /* day of month */
++ case 'e': /* day of month space padded */
++ gotmFlags.tm_mday = 1;
++ break;
++ case 'D': /* %m/%d/%y americanism */
++ gotmFlags.tm_mon = gotmFlags.tm_mday = gotmFlags.tm_year = 1;
++ break;
++ case 'G': /* ISO 8601 year repsesentation. depends on week */
++ case 'g': /* ISO 8601 year repsesentation without century. depends on week */
++ case 'U': /* sunday-based week number */
++ case 'V': /* ISO 8601 week number */
++ case 'W': /* monday-based week number */
++ case 'x': /* preferred date representation for locale without the time */
++ gotmFlags.tm_yday = gotmFlags.tm_year = 1;
++ break;
++ case 'H': /* 24h format hour */
++ case 'I': /* 12h format hour */
++ case 'k': /* 24h format hour space padded */
++ case 'l': /* 12h format hour space padded */
++ case 'p': /* AM/PM indicator */
++ case 'P': /* am/pm indicator */
++ gotmFlags.tm_hour = 1;
++ break;
++ case 'j': /* day of year */
++ gotmFlags.tm_yday = 1;
++ break;
++ case 'M': /* minute */
++ gotmFlags.tm_min = 1;
++ break;
++ case 'n': /* newline character */
++ case 't': /* tab character */
++ case 'z': /* time zone as an offset from GMT */
++ case 'Z': /* timezone name or abbreviation */
++ case '%': /* % character */
++ break;
++ case 'r': /* %I:%M:%S %p time in am/pm notation*/
++ case 'T': /* %H:%M:%S time in 24h notation */
++ case 'X': /* preferred time representation for locale without the date */
++ gotmFlags.tm_hour = gotmFlags.tm_min = gotmFlags.tm_sec = 1;
++ break;
++ case 'R': /* %H:%M time in 24h notation without seconds */
++ gotmFlags.tm_hour = gotmFlags.tm_min = 1;
++ break;
++ case 'S': /* second */
++ gotmFlags.tm_sec = 1;
++ break;
++ case 'c': /* preferred date and time representation for locale */
++ case 'E': /* weird modifier */
++ case 'O': /* weird modifier */
++ case 's': /* number of seconds since epoch */
++ case '+': /* date and time in date(1) format */
++ memset(&gotmFlags,0xFF,sizeof(gotmFlags));
++ break;
++ }
++ }
++ }
++ }
++
+ #ifdef USE_ZLIB
+ /*
+ check if there are enough gunzip buffers
+ */
+- if(argc>MAX_FILES) {
++ if(argc>=MAX_FILES) {
+ fputs("too many gzipped log files, aborting\n",stderr);
+ exit(1);
+ }
+@@ -134,9 +259,9 @@ int main (int argc, char *argv[]) {
+ /*
+ open log files
+ */
+- for (i=1;i<argc;i++) {
+- log_file[i-1]=myopen(argv[i],"r");
+- if (log_file[i-1] == NULL) {
++ for (i=0;i<argc;i++) {
++ log_file[i]=myopen(argv[i],"r");
++ if (log_file[i] == NULL) {
+ fprintf(stderr,"can't open %s, aborting\n",argv[i]);
+ exit(1);
+ }
+@@ -174,8 +299,8 @@ int main (int argc, char *argv[]) {
+ /*
+ init things for each log file and get the older date to start with
+ */
+- nb_files=argc-1;
+- for (i=0;i<argc-1;i++) {
++ nb_files=argc;
++ for (i=0;i<argc;i++) {
+
+ #ifdef USE_ZLIB
+ /*
+@@ -230,7 +355,7 @@ int main (int argc, char *argv[]) {
+ */
+ log_date=memchr(log_scan[i],'[',SCAN_SIZE);
+ if (log_date == NULL) {
+- fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i+1],log_buffer[i]);
++ fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i],log_buffer[i]);
+ exit(1);
+ }
+
+@@ -239,7 +364,7 @@ int main (int argc, char *argv[]) {
+ */
+ for (j=0;((j == 12)&&(memcmp(months+2*j,log_date+5,2) != 0));j++);
+ if (j == 12) {
+- fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i+1],log_buffer[i]);
++ fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i],log_buffer[i]);
+ exit(1);
+ }
+ memcpy(log_month[i],trans_digits[j],2);
+@@ -255,7 +380,7 @@ int main (int argc, char *argv[]) {
+ extract the date of this first line
+ */
+ if (sscanf(log_date+1,"%d/%3c/%d:%d:%d:%d",&day,month,&year,&hour,&minut,&second) < 6) {
+- fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i+1],log_buffer[i]);
++ fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i],log_buffer[i]);
+ exit(1);
+ }
+
+@@ -270,7 +395,7 @@ int main (int argc, char *argv[]) {
+ date->tm_isdst=-1;
+ for (j=0;((j<12)&&(memcmp(months+2*j,month+1,2) != 0));j++);
+ if (j == 12) {
+- fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i+1],log_buffer[i]);
++ fprintf(stderr,"abort due to a problem with %s:\n%s\n",argv[i],log_buffer[i]);
+ exit(1);
+ }
+ date->tm_mon=j;
+@@ -303,6 +428,8 @@ int main (int argc, char *argv[]) {
+ exit if we have only empty files
+ */
+ if (nb_files == 0) {
++ if(outFile)
++ myclose(outFile);
+ exit(0);
+ }
+
+@@ -323,7 +450,7 @@ int main (int argc, char *argv[]) {
+ /*
+ start to compute since this date
+ */
+- nb_files_orig=argc-1;
++ nb_files_orig=argc;
+ for(;;) {
+
+ /*
+@@ -377,7 +504,55 @@ int main (int argc, char *argv[]) {
+ write the log line
+ faster than a puts and we are sure to find a '\0' in log_buffer[i]
+ */
+- write(1,log_buffer[i],(size_t)((char *)memchr(log_buffer[i],0,BUFFER_SIZE)-log_buffer[i]));
++ if(goOutput) {
++ /* Check whether any of the date/time components concerned
++ * have changes or if we have no output file opened. It
++ * doesn't make much sense to do all the comparinsons in case
++ * we have no output file opened, but it makes even less sense
++ * to check for file handle each time we evaluate date. */
++ if(
++# define TMCOMPARE(tmpart) ( gotmFlags.tm_##tmpart && (outFileTM.tm_##tmpart!=date->tm_##tmpart) )
++ TMCOMPARE(sec) || TMCOMPARE(min) || TMCOMPARE(hour)
++ || TMCOMPARE(mday) || TMCOMPARE(mon) || TMCOMPARE(year)
++ || TMCOMPARE(wday) || TMCOMPARE(yday)
++ || !outFile
++# undef TMCOMPARE
++ ) {
++ if(!strftime(outFileNewName,sizeof(outFileNewName)-1,goOutput,date)) {
++ fprintf(stderr,"abort due to a failed attempt to generate output file name\n");
++ if(outFile)
++ myclose(outFile);
++ exit(1);
++ }
++ if( (!outFile) || strcmp(outFileName,outFileNewName) ) {
++ /* okay, we're about to change output file or start
++ * writing first file */
++ if(outFile) {
++ myclose(outFile);
++ }
++ if(goVerbose)
++ fprintf(stderr, "Writing to \"%s\"..\n",outFileNewName);
++ outFile = myopen(outFileNewName,"a");
++ if(!outFile) {
++ fprintf(stderr, "abort due to a failed attempt to open/create output file %s: %m\n",outFileNewName);
++ exit(1);
++ }
++ memmove(outFileName,outFileNewName,sizeof(outFileName));
++ memmove(&outFileTM,date,sizeof(outFileTM));
++ }
++ }
++ /* %Y-%m-%d_%H-%M-%S-access.log */
++ outBytes = (size_t)((char *)memchr(log_buffer[i],0,BUFFER_SIZE)-log_buffer[i]);
++ if( mywrite(outFile,log_buffer[i],outBytes) != outBytes) {
++ fprintf(stderr,"abort due to a failed write operation on output file %s: %m\n",outFileName);
++ if(outFile)
++ myclose(outFile);
++ exit(1);
++ }
++ }else{
++ /* do it the way we would do without */
++ write(1,log_buffer[i],(size_t)((char *)memchr(log_buffer[i],0,BUFFER_SIZE)-log_buffer[i]));
++ }
+
+ /*
+ is it an end of file ?
+@@ -388,7 +563,9 @@ int main (int argc, char *argv[]) {
+ close all log files and exit if all end of files are reached
+ */
+ if (--nb_files == 0) {
+- for (j=0;j<argc-1;j++) {
++ if(outFile)
++ myclose(outFile);
++ for (j=0;j<argc;j++) {
+ myclose(log_file[j]);
+ }
+ exit(0);
+@@ -425,7 +602,7 @@ int main (int argc, char *argv[]) {
+ } else {
+ for (j=0;((j<12)&&(memcmp(months+2*j,log_date+5,2) != 0));j++);
+ if (j == 12) {
+- fprintf(stderr,"problem with %s:\n%s\ncontinuing...\n",argv[i+1],log_buffer[i]);
++ fprintf(stderr,"problem with %s:\n%s\ncontinuing...\n",argv[i],log_buffer[i]);
+ } else {
+ memcpy(log_month[i],trans_digits[j],2);
+ memcpy(log_month[i]+2,months+2*j,2);
+@@ -439,7 +616,7 @@ int main (int argc, char *argv[]) {
+ }
+ }
+ } else {
+- fprintf(stderr,"problem with %s:\n%s\ncontinuing...\n",argv[i+1],log_buffer[i]);
++ fprintf(stderr,"problem with %s:\n%s\ncontinuing...\n",argv[i],log_buffer[i]);
+ }
+ }
+ }
+@@ -451,3 +628,7 @@ int main (int argc, char *argv[]) {
+ */
+ exit(1);
+ }
++/* vim:set textwidth=72: */
++/* vim:set cindent smartindent: */
++/* vim:set formatoptions-=t formatoptions+=croql: */
++/* vim:set expandtab shiftwidth=2: */
diff --git a/www-misc/mergelog/mergelog-4.5-r2.ebuild b/www-misc/mergelog/mergelog-4.5-r2.ebuild
new file mode 100644
index 000000000000..936acbb1f570
--- /dev/null
+++ b/www-misc/mergelog/mergelog-4.5-r2.ebuild
@@ -0,0 +1,25 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=4
+
+AUTOTOOLS_AUTORECONF=1
+inherit autotools-utils eutils
+
+DESCRIPTION="A utility to merge apache logs in chronological order"
+SRC_URI="mirror://sourceforge/mergelog/${P}.tar.gz"
+HOMEPAGE="http://mergelog.sourceforge.net"
+
+IUSE=""
+SLOT="0"
+LICENSE="GPL-2"
+KEYWORDS="amd64 ppc x86"
+
+RDEPEND="sys-libs/zlib"
+DEPEND="${DEPEND}"
+
+DOCS=( AUTHORS ChangeLog README)
+PATCHES=(
+ "${FILESDIR}"/${P}-splitlog.patch
+ "${FILESDIR}"/${P}-asneeded.patch
+)
diff --git a/www-misc/mergelog/metadata.xml b/www-misc/mergelog/metadata.xml
new file mode 100644
index 000000000000..ae81af2b9617
--- /dev/null
+++ b/www-misc/mergelog/metadata.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <!-- maintainer-needed -->
+ <longdescription>
+The Apache HTTP Server Project is an effort to develop and maintain an open-source HTTP server for modern operating systems including UNIX and Windows NT. The goal of this project is to provide a secure, efficient and extensible server that provides HTTP services in sync with the current HTTP standards.
+</longdescription>
+ <upstream>
+ <remote-id type="sourceforge">mergelog</remote-id>
+ </upstream>
+</pkgmetadata>