/*** AUTOMATICALLY GENERATED FILE - DO NOT EDIT **** ** ** This file was generated automatically by the makewikiinit.c ** program. See the sources to that program for additional ** information. ** ** This file contains code used to initialize the wiki for a new ** CVSTrac database. */ #include "config.h" #include "wikiinit.h" #include static const char zCamelCase[] = "*CamelCase* is the capitalization technique used to identify hyperlinks\n" "in wiki. Many wiki servers (including this one) use {quote: CamelCase},\n" "but others use more complex hyperlinking syntax.\n" "\n" "See also: WikiPageNames, WhatIsWiki.\n" ; static const char zChrootJailForCvstrac[] = "*Launching CVSTrac Into A Chroot Jail*\n" "\n" "CVSTrac will automatically put itself into a chroot jail if its\n" "first argument is _chroot_ and it is started as root. After the\n" "*chroot* argument, the next two arguments are the directory which\n" "should be the new root directory and the user that the program\n" "should run as after it is chrooted. (CVSTrac always drops any superuser\n" "privileges before doing any real work, regardless of whether or not\n" "you use the *chroot* option.) After the _chroot_ argument and its\n" "two parameters, the usual *cgi* or *http* keyword and its arguments\n" "appear.\n" "\n" "For the http://cvs.hwaci.com:2080/cvstrac/ site, CVSTrac is run from\n" "inetd. The inetd.conf configuration line looks like this:\n" "\n" " 2080 steam tcp nowait.1000 root /usr/bin/cvstrac \\\n" " cvstrac chroot /home/cvs cvs http /\n" "\n" "The three arguments *chroot /home/cvs cvs* tell the server to put\n" "itself into a chroot jail located at */home/cvs* and drop superuser\n" "privilege and become user *cvs* before continuing. The first three\n" "arguments are then removed and processing continues as if the\n" "command had been launched as\n" "\n" " cvstrac http /\n" "\n" "Notice that the directory argument to the _http_ directive, the argument\n" "that tells CVSTrac where to look for its database, is specified\n" "relative to the chroot jail, not to the regular filesystem.\n" "\n" "*Configuring The Jail*\n" "\n" "CVSTrac does a popen() of a few commands for some of its operations.\n" "It uses the following external programs: *rlog rcsdiff co.*\n" "The popen() procedure uses /bin/sh and rcsdiff uses diff.\n" "All of these external programs most be available inside the chroot\n" "jail. In addition, CVSTrac needs to access a stripped-down version\n" "of /etc/passwd at one point. It also needs access to the /tmp\n" "directory and to the special file /dev/null. The /etc/localhost\n" "file is optional, but without it, all times are shown in UTC.\n" "\n" "The following listing shows all the files and directories in the chroot jail\n" "for the canonical CVSTrac installation:\n" "\n" " bin\n" " bin/sh\n" " bin/bash\n" " dev\n" " dev/null\n" " etc\n" " etc/localtime\n" " etc/passwd\n" " lib\n" " lib/libc.so.6\n" " lib/ld-linux.so.2\n" " lib/libtermcap.so.2\n" " tmp\n" " usr\n" " usr/bin\n" " usr/bin/rcsdiff\n" " usr/bin/co\n" " usr/bin/rlog\n" " usr/bin/diff\n" "\n" "A similar set of files will be required in any chroot jail for\n" "CVSTrac, though the details may vary. For example, the required\n" "libraries might change. Or you might use a different shell.\n" "(The bin/sh above is a hard link to bin/bash)\n" "\n" "*Setup Changes*\n" "\n" "After you get CVSTrac running inside a chroot jail, you'll need to log in\n" "as the \"setup\" user, go to the \"setup\" page, and change the path to the\n" "CVS repository and the log file so that they are relative to the chroot\n" "jail not the regular filesystem. Other than that, though, no additional\n" "setup changes are required.\n" ; static const char zCreatingNewWiki[] = "These are the steps to create a new wiki pages:\n" "\n" "1: Choose a name for your new page. Use the established\n" " naming rules for selecting new WikiPageNames.\n" "\n" "2: Edit an existing wiki page to add a hyperlink to your\n" " new page. Save your edits.\n" "\n" "3: Click on the hyperlink you just created to take you to\n" " the new page. The screen will say that this page has\n" " never been created.\n" "\n" "4: Click the \"Edit\" button to enter edit mode and begin adding\n" " content to your new page.\n" "\n" "In this wiki implementation, usually only an administrator\n" "can {wiki:DeleteWiki delete a page}.\n" ; static const char zCvsRepositorySplitting[] = "Suppose you have two projects, named \"one\" and \"two\", in a single\n" "CVS repository named \"common\". Your directory structure looks something\n" "like this:\n" "\n" " /home\n" " |- one\n" " `- two\n" "\n" "In other words, the CVS repository is rooted at /home/cvs/common.\n" "All the source files are in /home/cvs/common/one and /home/cvs/common/two\n" "and the administrative files are in /home/cvs/common/CVSROOT.\n" "Our objective is to split this one repository into two, as follows:\n" "\n" " /home\n" " | `- one\n" " |\n" " `- two\n" " `- two\n" "\n" "In the new setup, the first CVS repository is at /home/cvs/one and\n" "the second CVS repository is at /home/cvs/two. Each has its own\n" "subdirectory for content and for administrative files.\n" "\n" "The first step is to create the new directories and copy in the\n" "appropriate files.\n" "\n" " mkdir /home/cvs/one\n" " mv /home/cvs/common/one /home/cvs/one\n" " mkdir /home/cvs/one/CVSROOT\n" " cp /home/cvs/common/CVSROOT/* /home/cvs/one/CVSROOT\n" " mkdir /home/cvs/two\n" " mv /home/cvs/common/two /home/cvs/two\n" " mv /home/cvs/common/CVSROOT /home/cvs/two\n" " rmdir /home/cvs/common\n" "\n" "Notice that the content files for each project were moved into\n" "their appropriate CVS repository but that the administrative\n" "files were copied into both of the new repositories. The next\n" "step is to modify the CVSROOT/history files in each of the new\n" "repositories so that they only contain information about the\n" "files in their respective repositories.\n" "\n" " cd /home/cvs/one/CVSROOT\n" " mv history history.orig\n" " grep 'one/' history.orig >history\n" " cd /home/cvs/two/CVSROOT\n" " mv history history.orig\n" " grep 'two/' history.orig >history\n" "\n" "We're done. Now each project is in its own CVS repository. Now\n" "you can create a separate CVSTrac database for each project.\n" ; static const char zCvstracAdmin[] = "***CVSTrac Administration***\n" "\n" "*Getting Started*\n" "\n" "*: {link: http://www.cvstrac.org/cvstrac/wiki?p=DownloadCvstrac Downloading}\n" "*: {link: http://www.cvstrac.org/cvstrac/wiki?p=HowToCompile Compiling}\n" "*: {link: http://www.cvstrac.org/cvstrac/wiki?p=CvstracInstallation Installing}\n" "*: {wiki: ChrootJailForCvstrac Secure installations}\n" "*: {wiki: LocalizationOfCvstrac Localization}\n" "\n" "*Setup Notes*\n" "\n" "The CVSTrac configuration pages are mostly self-explanatory. Some notes are in\n" "order for other things.\n" "\n" "*: {wiki: CvstracAdminHomePage Site home page}\n" "*: {wiki: CvstracAdminTicketState Choosing ticket states}\n" ; static const char zCvstracAdminHomePage[] = "***CVSTrac Home Page***\n" "\n" "The default home page for a CVSTrac installation is a simple index page.\n" "\n" "If a Wiki page called HomePage exists, is non-empty, and is _locked_, that page\n" "will be used instead of the index page (which is still accessible under a \"Main\n" "Menu\" link).\n" ; static const char zCvstracAdminTicketState[] = "***CVSTrac Ticket State***\n" "\n" "The default ticket states are (at the database level) _new_, _review_, _defer_,\n" "_active_, _fixed_, _tested_, and _closed_.\n" "\n" "While it is certainly possible to change them, note that internally CVSTrac\n" "interprets states starting with the characters \"n\" or \"a\" as *active* and those\n" "starting with \"f\", \"t\" or \"c\" as *fixed*.\n" ; static const char zCvstracAttachment[] = "***CVSTrac Attachments***\n" "\n" "CVSTrac allows arbitrary files to be attached to any\n" "{wiki: CvstracWiki wiki} and {wiki: CvstracTicket ticket} pages.\n" "\n" "Attachments to a page are generally listed near the bottom of the page.\n" "\n" "**Attaching a File**\n" "\n" "Assuming you have proper permissions, clicking on an *Attach* link in a wiki or\n" "ticket page will send you to an upload form. Choose the file from your local\n" "disk and, optionally, add a\n" "{wiki: FormattingWikiPages wiki-formatted} description. Then upload.\n" "\n" "Note that any provided description cannot be editted after uploading.\n" "\n" "Each uploaded attachment is internally assigned a unique identifier. As such,\n" "you can upload the same filename multiple times to as many places as you'd\n" "like, as many times as you'd like.\n" "\n" "Maximum attachments sizes are\n" "configurable. The default is usually 100k.\n" "\n" "**Getting Attachments**\n" "\n" "Uploaded attachments can be downloaded simply by clicking on the link in the\n" "listing. CVSTrac preserves the original MIME type so as long as the uploader\n" "got that part right things like special viewers should be automatically\n" "launched by the browser.\n" "\n" "Image attachments may also be inlined by the attachment filename with\n" "{quote: {image:}} markups. Note that if the same filename was uploaded multiple\n" "times the results are undefined.\n" ; static const char zCvstracBrowse[] = "***CVSTrac Browser***\n" "\n" "CVSTrac includes a powerful repository browser. It allows you to quickly\n" "navigate through the repository (deleted or otherwise) and view the\n" "{wiki: CvstracFileHistory change history} for any given file.\n" "\n" "**Short View**\n" "\n" "The basic browser view is simply a list of filenames. Directories are always\n" "listed first. Clicking on a file takes you to the\n" "{wiki: CvstracFileHistory file history} page.\n" "\n" "**Long View**\n" "\n" "More recently added, the Long view is similar to that provided by applications\n" "like {link: http://freshmeat.net/projects/cvsweb/ cvsweb}. Files are listed in\n" "a table with revision, user, age and {wiki: CvstracCheckin check-in} comments.\n" "Clicking on the column headers causes the display to be sorted according to the\n" "column.\n" "\n" "Clicking on the revision takes you directly to the\n" "{wiki: CvstracFileview file view} for that revision. Selecting the filename\n" "takes you to the {wiki: CvstracFileHistory file history} page. You can also go\n" "directly to the {wiki: CvstracCheckin check-in}.\n" "\n" "**Deleted Files**\n" "\n" "The browser shows deleted files with a red 'X' icon. Because of how CVS does\n" "branches, this deleted state only reflects the most recent commit for that file\n" "in any branch. It may (and probably is) still be an active file _somewhere_ in\n" "the revision tree.\n" ; static const char zCvstracCheckin[] = "***CVSTrac Check-ins***\n" "\n" "A check-in (sometimes called a patchset or changeset) is simply a commit to the\n" "repository. It includes a message\n" "describing the change, a source code diff, and various information such as who\n" "made the change, when it was made.\n" "\n" "CVSTrac attempts to represent a CVS commit as a single atomic operation (called\n" "a patch-set), even when the commit includes multiple directories. Other SCMs\n" "supported by CVSTrac would typically already represent commits atomically.\n" "\n" "**Check-in Features**\n" "\n" "*Fields*\n" "\n" "*: *Check-in number* is a unique number for the patchset which can be\n" "referenced from any {wiki: FormattingWikiPages wiki} using the\n" "{quote: [nnn]} markup.\n" "*: *User* is the repository user who made the change. This may not necessarily\n" "match a CVSTrac user.\n" "*: *Branch* is check-in on a branch. Branch activity is usually highlighted in\n" "various displays with a slightly different background.\n" "\n" "*Comment*\n" "\n" "A check-in comment is simply the contents of the CVS commit message. However,\n" "CVSTrac interprets such comments as\n" "{wiki: FormattingWikiPages wiki markup}, allowing for a much richer\n" "presentation when reading change messages in a browser.\n" "\n" "Check-in comments can be editted within CVSTrac (i.e. to fix an incorrect\n" "ticket number). However, any such changes are only help in the CVSTrac database\n" "and aren't visible in the repository itself. On the flip side, direct\n" "manipulation of the repository (such as with the =cvs admin= command) usually\n" "won't propogate to the CVSTrac database either.\n" "\n" "*Files*\n" "\n" "Each check-in has a list of associated files. Following each file will bring\n" "you the {wiki: CvstracFileHistory file history} page.\n" "\n" "*Diffs*\n" "\n" "When viewing a check-in, a complete _diff_ of the change is shown. The\n" "formatting of this _diff_ may be enriched with\n" "custom filter.\n" "\n" "*Tickets*\n" "\n" "A check-in can be associated with a specific\n" "{wiki: CvstracTicket ticket} by mentioning the ticket\n" "number in {quote: #n} format inside the commit message. This allows development\n" "activity to be associated with a particular problem report.\n" "\n" "**Committing Changes**\n" "\n" "Changes are committed in the usual fashion (using a CVS command-line program).\n" "However, in order to maximize the grouping of commits within a single patchset,\n" "it's recommended that related commits be done all at once, with the same commit\n" "message.\n" "\n" "Commits can be made using {wiki: FormattingWikiPages wiki markup}.\n" "Commits made in relation to a specific ticket can be associated with that\n" "ticket simply by mentioning the ticket number. i.e.\n" "\n" " cvs commit -m \"Fix for ticket #45\" Makefile src/file.c include/header.h\n" "\n" "**Inspections**\n" "\n" "{wiki: CvstracInspection Inspections} are short comments (40 chars)\n" "attached to check-ins. There's no limit to the number of inspections that can\n" "be associated with a check-in.\n" "\n" "**Patchsets**\n" "\n" "A patchset is basically a single _diff_ of all the changes in a check-in. In\n" "theory, it's designed such that one can download it and recreate the changes\n" "using _patch_. In practice, this may not work well with binary files.\n" ; static const char zCvstracDocumentation[] = "***CVSTrac Documentation***\n" "\n" "_A Web-Based {wiki: CvstracTicket Bug} And\n" "{wiki: CvstracCheckin Patch-Set} Tracking System For CVS_\n" "\n" "**Overview**\n" "\n" "*: Single {wiki: CvstracTimeline timeline} shows all activity at a\n" "glance\n" "*: Automatically generates a {wiki: CvstracCheckin patch-set} log from\n" "CVS {wiki: CvstracCheckin check-in} comments\n" "*: User-defined color-coded {wiki: CvstracReport database queries}\n" "*: {wiki: CvstracAdmin Web-based administration} of the\n" "=CVSROOT/passwd= file\n" "*: Built-in {wiki: CvstracBrowse repository browser}\n" "*: Built-in {wiki: CvstracWiki Wiki}\n" "*: Very simple {wiki: CvstracAdmin setup} - a self-contained\n" "executable runs as CGI, from inetd, or as\n" "a stand-alone web server\n" "\n" "**CVSTrac Objects**\n" "\n" "*: {wiki: CvstracTicket Tickets}\n" "*: {wiki: CvstracCheckin Check-ins and Patch-Sets}\n" "*: {wiki: CvstracWiki Wiki pages}\n" "*: {wiki: CvstracReport Reports}\n" "*: {wiki: CvstracMilestone Milestones}\n" "*: {wiki: CvstracAttachment File Attachments}\n" "*: {wiki: CvstracInspection Inspections}\n" "\n" "**Using CVSTrac**\n" "\n" "*: {wiki: CvstracTimeline Using the timeline}\n" "*: {wiki: CvstracSearch Searching for things}\n" "*: {wiki: CvstracBrowse Browsing the repository}\n" "*: {wiki: CvstracFileHistory Viewing file changes}\n" "*: {wiki: CvstracFileview Getting file contents}\n" "*: {wiki: CvstracLogin Managing your account}\n" "\n" "**Setup and Maintenance**\n" "\n" "*: {wiki: CvstracAdmin Administrator Documentation}\n" "*: {wiki: ChrootJailForCvstrac chroot Jails}\n" "*: {wiki: LocalizationOfCvstrac Localization}\n" ; static const char zCvstracFileHistory[] = "***CVSTrac File History***\n" "\n" "The file history view, typically reached after clicking on a repository\n" "filename, shows the full chronological revision history for a particular file.\n" "From this history it's possible to view individual versions of a file, diff\n" "between subsequent versions, or see the {wiki: CvstracCheckin check-in} which\n" "created a version. For CVS, branch activity is also shown.\n" ; static const char zCvstracFileview[] = "***CVSTrac File View***\n" "\n" "Viewing a specific revision of a file brings up the file view. This shows the\n" "filename (which links to the {wiki: CvstracFileHistory file history}, the\n" "revision, and the file contents (run through an optional\n" "filter). It's also possible to get a raw version of\n" "the file without any HTML markup.\n" "\n" "Note that binary files cannot be viewed.\n" ; static const char zCvstracInspection[] = "***CVSTrac Inspections***\n" "\n" "An inspection is simply a short note associated with a\n" "{wiki: CvstracCheckin check-in}. Currently, the limit is 40 characters.\n" "\n" "Inspections may be used to document the results of code reviews and testing.\n" "They may be used to note whether or not the fix worked. They may also be used\n" "to provide directions such as whether or not a check-in should be merged or\n" "backported.\n" "\n" "Any number of inspections may be associated with a given check-in. If they\n" "check-in is associated with a {wiki: CvstracTicket ticket} then the\n" "inspections will also be displayed in the ticket view and history pages.\n" "\n" "Inspections may not be editted or deleted after they're created.\n" ; static const char zCvstracLogin[] = "***CVSTrac Login***\n" "\n" "If you're *anonymous*, you might want to read\n" "{wiki: CvstracDocumentation something else}.\n" "\n" "If you have a CVSTrac account, you can login by clicking the \"Not logged in\"\n" "message found just below the page title. Login buttons are also avilable in\n" "other places and you'll probably be prompted to login if you try something\n" "which needs extra permissions.\n" "\n" "**Requirements**\n" "\n" "In order to login, browser cookies must be enabled. CVSTrac only uses session\n" "cookies, so you'll need to login each new browser session. Additionally,\n" "CVSTrac tracks your IP address. User behind proxies using variable addresses\n" "will have serious difficulty using CVSTrac sites.\n" "\n" "**Passwords**\n" "\n" "You can change your password by following an \"Logout\" link or clicking on the\n" "\"Logged in\" text. You may also log out that way.\n" "\n" "**User Pages**\n" "\n" "Recent versions of CVSTrac have introduced user home pages. Basically, each\n" "user can have a personal {wiki: CvstracWiki wiki page}. Once a user creates\n" "such a page, his or her name will become a hotlink back to the page in various\n" "places such as the {wiki: CvstracTimeline timeline}. This page can be used as a\n" "personal scratchpad or can include embedded reports relevant to the user.\n" "\n" "Once the user is logged in, they're user name in the upper left corner becomes\n" "a link to their page.\n" ; static const char zCvstracMilestone[] = "***CVSTrac Milestones***\n" "\n" "A milestone is an object which pins an event to a specific name and date. This\n" "would include things like releases, branch points, builds, project milestones,\n" "etc.\n" "\n" "**Milestone Features**\n" "\n" "*Fields*\n" "\n" "*: *Date and Time* should be obvious. A date may be in the future.\n" "*: *Type* is either _Release_ or _Event_. _Release_ milestones may be shown in\n" "{wiki: CvstracFileHistory file revision} views.\n" "*: *Branch* would identify a specific CVS code branch.\n" "*: *Comment* is a {wiki: FormattingWikiPages wiki field} describing the\n" "milestone.\n" "\n" "A milestone may also be associated with tickets by referencing the ticket\n" "number in the comment. Some milestones will also be associated with a\n" "directory, such as those created by CVS repository activity.\n" "\n" "**Creating A Milestone**\n" "\n" "There are two ways to create a milestone. Once created, milestones can't\n" "currently be deleted.\n" "\n" "*Manual Method*\n" "\n" "By clicking on the *Milestone* link, one can manually create a milestone and\n" "populate each field directly.\n" "\n" "*Repository Method*\n" "\n" "You can create an _Event_ milestone using the =cvs rtag= command. The name of\n" "the tag becomes the milestone comment. For example:\n" "\n" " cvs rtag build_5918 cvstrac\n" "\n" "will create an _Event_ milestone for the =cvstrac= directory with \"build_5918\"\n" "as the milestone comment.\n" "\n" "**Using Milestones**\n" "\n" "Milestones are mostly useful as markers in various pages, such as the\n" "{wiki: CvstracTimeline timeline}.\n" ; static const char zCvstracReport[] = "***CVSTrac Reports***\n" "\n" "A report is simply a {link: http://www.sqlite.org/ SQLite} database query with\n" "special functions and output formatting appropriate for web presentation.\n" "\n" "The basic idea is that a SQL query is run and each resulting row is formatted\n" "as a separate row in an HTML table. Table headers are determined dynamically\n" "from column names and, in a few cases, special columns get their own\n" "interpretations (to specify a row background color, or identify a column as\n" "containing linkable ticket numbers).\n" "\n" "A report query can be written against most tables in\n" "the CVSTrac database and must contain a single SELECT statement.\n" "Subqueries are not allowed.\n" "\n" "**Viewing Reports**\n" "\n" "The *Reports* link brings up a list of all available reports. Each report can\n" "be viewed simply by selecting the title. The raw (unformatted) data can be seen\n" "(and downloaded) from within a report view using the *Raw Data* link.\n" "\n" "The SQL used to generate the report can also be viewed at any time. This is\n" "useful if you wanted to write custom queries outside of CVSTrac against the\n" "SQLite database. Keep in mind, however, that some functions are only available\n" "inside CVSTrac. And, of course, you'll lose the meaning of some of the\n" "\"special\" columns.\n" "\n" "Reports may also be embedded into {wiki: CvstracWiki wiki pages} using the\n" "{quote:{report: rn}} syntax, where _rn_ is the report number as listed in the\n" "report URL (_not_ the same number in the report list).\n" "\n" "**Creating a report**\n" "\n" "You can create a new report directly (following the appropriate link) or by\n" "making a copy of an existing report (particularly one that does almost what you\n" "need). In order to create or edit a report, a user must have the\n" "query permission set.\n" "\n" "Each report should have a unique and self-explanatory title.\n" "\n" "*Tables*\n" "\n" "Most tables in the CVSTrac database are available for use in reports. However,\n" "keep in mind that the usual access restrictions are applied to all queries. In\n" "other words, users without\n" "checkout permissions will not be able to see\n" "the contents of the *chng* table.\n" "\n" "*Special Column Names*\n" "\n" "*: *bgcolor* indicates an HTML table background color which will be used for\n" "the entire row. The column itself will now be displayed.\n" "\n" "*: A column named {quote: #} indicates that the column contains\n" "{link:wiki?p=CvstracTicket ticket numbers}. Numbers in that column will be\n" "represented as links to the appropriate ticket and an extra _edit_ column will\n" "be shown for users with ticket write permissions.\n" "\n" "*: Columns named with a leading {quote: _} will be shown by themselves as\n" "separate rows. The row contents are assumed to be\n" "{link:wiki?p=FormattingWikiPages wiki formatted}. This is useful for things\n" "like ticket remarks, descriptions, check-in comments, attachment descriptions,\n" "etc.\n" "\n" "The =wiki()=, =tkt()= and =chng()= functions also give some control over column\n" "formatting.\n" "\n" "**Available SQL Functions**\n" "\n" "See the {link: http://www.sqlite.org/ SQLite} documentation for the standard\n" "functions.\n" "\n" "*: =sdate()= converts an integer which is the number of seconds since 1970 into\n" "a short date or time description. For recent dates (within the past 24 hours)\n" "just the time is shown. (ex: 14:23) For dates within the past year, the month\n" "and day are shown. (ex: Apr09). For dates more than a year old, only the year\n" "is shown.\n" "\n" "*: =ldate()= converts an integer which is the number of seconds since 1970 into\n" "a full date and time description.\n" "\n" "*: =now()= takes no arguments and returns the current time in seconds since\n" "1970. =now()= is useful mostly for calculating relative cutoff times in\n" "queries.\n" "\n" "*: =user()= takes no arguments and returns the user ID of the current user.\n" "\n" "*: =aux()= takes a single argument which is a parameter name. It then returns\n" "the value of that parameter. The user is able to enter the parameter on a\n" "form. If a second parameter is provided, the value of that parameter will be\n" "the initial return value of the =aux()= function. =aux()= allows creation of\n" "reports with extra query capabilities, such as:\n" "\n" " SELECT\n" " cn as 'Change #',\n" " ldate(date) as 'Time',\n" " message as 'Comment'\n" " FROM chng\n" " WHERE date>=now()-2592000 AND user=aux('User',user())\n" " ORDER BY date DESC\n" "\n" "which allows a user to enter a userid and get back a list of\n" "{link:wiki?p=CvstracCheckin check-ins} made within the last 30 days.\n" "\n" "*: =option()= takes a parameter name as an argument and, as with *aux()*,\n" "returns the value of that parameter. The user is able to select an option value\n" "from a drop down box. The second argument is a SQLite query which returns one\n" "or two columns (the second column being a value description). For example:\n" "\n" " SELECT\n" " cn as 'Change #',\n" " ldate(date) as 'Time',\n" " message as 'Comment'\n" " FROM chng\n" " WHERE date>=now()-2592000\n" " AND user=option('User','SELECT id FROM user')\n" " ORDER BY date DESC\n" "\n" "*: =cgi()= returns the value of a CGI parameter (or the second argument if the\n" "CGI parameter isn't set). This is mostly useful in embedded reports.\n" "\n" "*: =parsedate()= converts an ISO8601 date/time string into the number of\n" "seconds since 1970. It would be useful along with the =aux()= function for\n" "creating queries with variable time.\n" "\n" "*: =search()= takes a (space separated) keyword pattern and a target text\n" "and returns an integer score which increases as more of the keywords are\n" "found in the text. The following scoring pattern is used:\n" "|0|No sign of the word was found in the text|\n" "|6|The word was found but not on a word boundry|\n" "|8|The word was found with different capitalization|\n" "|10|The word was found in the text exactly as given|\n" "\n" "*: =wiki()= causes its argument to be rendered as wiki markup.\n" "\n" "*: =tkt()= causes its argument to be rendered as a ticket number. For example:\n" "\n" " SELECT\n" " tkt(tn) AS 'Tkt',\n" " owner AS 'Owner',\n" " FROM ticket\n" "\n" "*: =chng()= causes its argument to be rendered as a check-in.\n" "\n" "*: =path()= is used to extract complete filename from FILE table.\n" "It takes 3 parameters: isdir, dir and base. For example:\n" "\n" " SELECT path(isdir, dir, base) AS 'filename' FROM file\n" "\n" "*: =dirname()= takes filename as only argument and extracts parent directory\n" " name from it.\n" "\n" " SELECT dirname('/path/to/dir/') => '/path/to/'\n" " SELECT dirname('/path/to/dir/file.c') => '/path/to/dir/'\n" "\n" "*: =basename()= takes filename as only argument and extracts basename from it.\n" "\n" " SELECT basename('/path/to/dir/') => 'dir'\n" " SELECT basename('/path/to/dir/file.c') => 'file.c'\n" "\n" ; static const char zCvstracSearch[] = "***CVSTrac Search***\n" "\n" "CVSTrac allows for full-text searching on {wiki: CvstracTicket ticket} title,\n" "remarks and descriptions, {wiki: CvstracCheckin check-in comments},\n" "and {wiki: CvstracWiki wiki pages}.\n" "\n" "Additionally, it can search for attachment and repository filenames. This is a\n" "convenient way to navigate to files deep in a repository.\n" "\n" "CVSTrac _cannot_ currently do full-text searches on the contents of files.\n" "\n" "**Search Syntax**\n" "\n" "There is not special syntax. The search algorithm takes all the search keywords\n" "and scores them against the various database fields. Results are returned in\n" "decreasing score order.\n" ; static const char zCvstracTicket[] = "***CVSTrac Tickets***\n" "\n" "A ticket is an object describing and tracking a bug, feature request, project,\n" "action item, or any other type of thing that you might want to track within a\n" "software development team.\n" "\n" "Unlike some issue tracking systems, CVSTrac doesn't associate significant\n" "amounts of process overhead with tickets. There aren't any constraints on who\n" "can change specific fields, what states can lead to other states, who can\n" "assign tickets, etc.\n" "\n" "**Ticket Features**\n" "\n" "*Properties*\n" "\n" "Tickets have the following fields available:\n" "\n" "*: *Ticket Number* is unique to each ticket and can be referenced in\n" "{wiki: FormattingWikiPages wiki markup} using the\n" "{quote: #n} syntax.\n" "*: *Title* should be as descriptive as possible since it appears in\n" "various cross-references, reports, ticket link titles, etc.\n" "*: *Type* describes the kind of ticket, such as _bug_, _action item_, etc.\n" "Ticket types are configurable.\n" "*: *Status* describes the current state of the ticket. Possible states\n" "are also configurable.\n" "*: *Severity* defines how debilitating the issue is. A scale from one to five\n" "is used, with one being most critical.\n" "*: *Priority* decribes how quickly the ticket should be resolved. This isn't\n" "necessarily related to *Severity* (i.e. a serious bug in a non-operational\n" "product isn't always high priority).\n" "*: *Assigned To* identifies which CVSTrac user should be handling the ticket.\n" "*: *Creator* identifies which CVSTrac user created the ticket (including,\n" "possible, *anonymous*)\n" "*: *Version* should be used to report the product version related to the\n" "ticket.\n" "*: *Created* shows when the ticket was created.\n" "*: *Last Changed* shows when the ticket was last changed.\n" "*: *Subsystem* is intended to identify which component/area has a problem.\n" "This list _must_ be configured by the administrator.\n" "*: *Derived From* lists a parent ticket, if any.\n" "*: *Contact* lists a way to get hold of the problem reporter. Typically, this\n" "is an e-mail address. Contact information is _not_ made available to\n" "*anonymous* CVSTrac users.\n" "*: *Description* is a {wiki: FormattingWikiPages wiki} field providing\n" "information about the nature of the ticket.\n" "\n" "Additional custom ticket fields may be\n" "defined by the administrator. This could include things like billing\n" "information, due dates, completion percentages, resolutions, reporting\n" "organizations, etc.\n" "\n" "*Remarks*\n" "\n" "The *Remarks* property is a special {wiki: FormattingWikiPages wiki}\n" "field which can be editted directly, but also has a special _append_ option\n" "where users can add comments and discussion to a ticket. When appending, a\n" "timestamp and user name is automatically added into the remarks.\n" "\n" "*Related Objects*\n" "\n" "Any {wiki: CvstracCheckin check-ins} and\n" "{wiki: CvstracMilestone milestones} related to the ticket are listed in\n" "their own sections.\n" "\n" "Tickets may also have _children_ which reference them in their *Derived From*\n" "properties. These child tickets will be listed in a separate section, allowing\n" "a certain amount of hierarchical project task management.\n" "\n" "*History*\n" "\n" "A separate page containing a full ticket history provides a chronologically\n" "ordered list of _all_ events associated with a ticket. Property changes,\n" "remarks, check-ins, attachments, inspections, etc, are all listed here.\n" "\n" "Changes to certain fields, such as *Description* and *Remarks* are shown in\n" "_diff_ style.\n" "\n" "*Attachments*\n" "\n" "Arbitrary files may be\n" "{wiki: CvstracAttachment attached} to tickets. This could include things\n" "like screenshots, specifications, standards documents, etc. Attachments are of\n" "limited size.\n" "\n" "**Creating New Tickets**\n" "\n" "A new ticket is created by clicking on the *Ticket* link available in the\n" "navigation bar. A new ticket form will be opened and the user would then enter\n" "all appropriate information.\n" "\n" "The ticket form is a combination of text fields and dropdown menus. Dropdown\n" "menus provide a fixed set of items to choose from and are often populated with\n" "reasonable defaults.\n" "\n" "A large text area is provided for the problem description. As with most\n" "components of CVSTrac, this text area allows (and encourages) the use of\n" "{wiki: FormattingWikiPages wiki formatting}.\n" "\n" "As with any such system, detailed and complete information is encouraged.\n" "\n" "**Changing Tickets**\n" "\n" "Ticket properties can be editted by following the _Edit_ link in the ticket\n" "view. Remarks can be added by following the _Add remarks_ link in the *Remarks*\n" "area of a ticket view.\n" "\n" "A ticket can be automatically associated with a\n" "{wiki: CvstracMilestone milestone} or\n" "{wiki: CvstracCheckin check-in} simply by mentioning the ticket in the\n" "appropriate message using the {quote: #n} wiki markup.\n" "\n" "In some cases, ticket changes may result in\n" "notifications being triggered, if the\n" "administrator has configured this.\n" "\n" "**Undoing Changes**\n" "\n" "When in the _history_ view, it's possible to undo changes. A user with *delete*\n" "permissions or the user responsible\n" "for the change can do this within 24 hours while a user with *admin*\n" "permissions can do so at any time. An _undo_\n" "link is included at the last item of the history page in this case.\n" "\n" "**Deleting Tickets**\n" "\n" "Users with *setup* permissions can always delete\n" "tickets. Tickets should only be deleted as a last resort. If\n" "a ticket contains valuable project history, it should instead be closed.\n" "\n" "Users (except *anonymous*) with *delete* permissions\n" "can delete tickets created by *anonymous* within 24 hours of ticket creation.\n" ; static const char zCvstracTimeline[] = "***CVSTrac Timeline***\n" "\n" "The timeline is a unified chronological view of all\n" "{wiki: CvstracTicket ticket}, {wiki: CvstracCheckin check-in},\n" "and {wiki: CvstracWiki wiki} activity on a given CVSTrac project.\n" "\n" "**Organization**\n" "\n" "A timeline is basically a table of CVSTrac objects. Normally, these objects are\n" "broken up by day or by milestone. Each object is dated, has some kind of\n" "identifying icon, a description of the object, _some_ detail about the change,\n" "the name of the user responsible, and, if you have sufficient permissions, a\n" "link to a more detailed view of the object.\n" "\n" "At the bottom of the page is a grouping of controls to change various timeline\n" "settings.\n" "\n" "**Filtering**\n" "\n" "Most of the timeline toggles are about filtering what objects are seen. It's\n" "also possible to control the time window shown in the timeline by adjusting the\n" "number of days and the end date/time.\n" "\n" "**Preferences**\n" "\n" "If you change any timeline settings, the new settings are stored in a browser\n" "cookie. Additionally, a user with *admin* settings can force his/her current\n" "timeline settings to be the default for all other users.\n" "\n" "**Activity Feeds**\n" "\n" "The timeline is available as an RSS feed. Just follow the \"RSS\" link if the\n" "site admin doesn't have feed auto-discovery enabled.\n" ; static const char zCvstracWiki[] = "***CVSTrac Wiki***\n" "\n" "CVSTrac includes a full-featured {wiki: WhatIsWiki wiki} document\n" "system. What's unique is the ability to use\n" "{wiki: FormattingWikiPages wiki markup} virtually anywhere where text\n" "can be entered, including things like\n" "{wiki: CvstracTicket tickets} and {wiki: CvstracCheckin check-ins}.\n" "\n" "**Wiki Documentation**\n" "\n" "*: FormattingWikiPages\n" "*: WikiPageNames\n" "*: WhatIsWiki\n" "*: CreatingNewWiki\n" "*: DeleteWiki\n" "\n" "**Revisions**\n" "\n" "Each version of a CVSTrac wiki page is kept in the database. This means that\n" "the entire history of a page can be examined, differences identified, old\n" "changes resurrected, etc.\n" "\n" "*History*\n" "\n" "Clicking the *History* link on any wiki page will toggle on a list of all\n" "revisions of the page, including the datestamp and user who made the change.\n" "It's then possible to quickly view each version of the page. It's also possible\n" "to {link: wiki?p=DeleteWiki delete} specific revisions of a page.\n" "\n" "Wiki page revisions which have been deleted will, obviously, not be available\n" "in this list.\n" "\n" "*Diff*\n" "\n" "Clicking on the *Diff* link for any revision of a wiki page will show the\n" "changes between that revision and the previous revision.\n" "\n" "**Attachments**\n" "\n" "Arbitrary files can be {wiki: CvstracAttachment attached} to wiki pages\n" "by clicking on the *Attach* link and uploading files.\n" "\n" "Attachments to a page can be reference by filename in {quote: {image:}} markup\n" "sections, allowing images to be attached to pages and directly embedded in the\n" "page content.\n" ; static const char zDeleteWiki[] = "CVSTrac normally allows wiki pages to be deleted only by\n" "users with administrator privileges. Users with *delete* permissions are also\n" "able to delete some pages within 24 hours of creation. This is normally done to\n" "help prevent {link: http://cvstrac.org/cvstrac/wiki?p=WikiSpam WikiSpam}.\n" "\n" "When a user with delete credentials\n" "looks at a wiki page, one of the buttons on the upper right-hand\n" "corner of the page will be [Delete]. The user just\n" "has to click on this hyperlink to delete the page.\n" "(Actually, a confirmation page appears first, to help prevent\n" "accidental page deletions.)\n" "\n" "The administrator can also delete historical copies of a page.\n" "To do this, put the page in [History] mode and select the version\n" "of the page to be deleted. Then click on the [Delete] hyperlink\n" "as before. The confirmation screen that appears gives the\n" "administrator there options:\n" "\n" "1: Delete the page completely.\n" "\n" "2: Delete the version of the page being viewed and\n" " all versions.\n" "\n" "3: Delete just the version being viewed.\n" "\n" "CVSTrac stores the complete text of every version of a wiki page\n" "in its database. If a single page has many edits, it can begin\n" "to take up a lot of space in the database, especially if the page\n" "is big. Administrators may want to periodically go through and\n" "delete all but the most recent two or three versions of large,\n" "frequently edited pages.\n" "\n" "All deletions are permanent.\n" ; static const char zFormattingWikiPages[] = "**Paragraphs**\n" "\n" "Use one or more blank lines to separate paragraphs. If the\n" "first line of a paragraph begins with a tab or with two or\n" "more spaces, then that whole paragraph is shown verbatim\n" "(that is, within
...
markup in HTML.) The\n" "formatting rules below do not apply to verbatim paragraphs.\n" "\n" "**Fonts**\n" "\n" "Text contained between asterisks is rendered in a *bold font.*\n" "If you use two or three asterisks in a row, instead of just\n" "one, the bold text is also shown in a larger font.\n" "Text between underscores is rendered in an _italic font._\n" "Text between equals is rendered in a =fixed font.=\n" "All font markers must start at the beginning of a word and must\n" "finish at the end of a word within the same paragraph.\n" "\n" "**Lists**\n" "\n" "If a line begins with the characters \"*:\" followed by a space or\n" "tab, then that line becomes an item in a bullet list. Similarly,\n" "if the line begins with \"N:\" (where N is any number including a\n" "multi-digit number) then the line becomes an item in an\n" "enumeration list. Enumeration items are automatically renumbered\n" "so the values of N do not need to be in accending order.\n" "\n" "Lines that begin with \"_:\" are indented like a\n" "bullet list but do not display the bullet.\n" "\n" "Make nested lists by adding colons. For example, to make a\n" "second level bullet, begin the line with \"*::\".\n" "\n" "**Hyperlinks**\n" "\n" "Links to other pages are created automatically whenever the name\n" "of another wiki page is mentioned in the text. (See WikiPageNames.)\n" "If you want to use alternative text, use the form\n" "\"{quote: {wiki: TITLE TEXT}}\".\n" "If you want to put a CamelCase word in your text but you do not\n" "want it to become a hyperlink, enclose the name in\n" "\"{quote: {quote: ...}}\".\n" "\n" "A link to an external website is created for every URL beginning\n" "with \"http:\", \"https:\", \"ftp:\", or \"mailto:\". If the URL ends with\n" "\".jpg\", \".jpeg\", \".gif\", or \".png\" then the image that the URL points\n" "to is displayed inline on the wiki page. You can also create an\n" "inline image using markup like this: \"{quote: {image: URL}}\".\n" "Using the {quote: {image:...}} markup allows the image URL to be\n" "relative. This allows an image stored in an\n" "attachment to be displayed inline.\n" "\n" "Text of the form *#NNN* where the *NNN* is a valid ticket number\n" "becomes a hyperlink to the ticket. Text of the form *[NNN]* where\n" "*NNN* is a valid check-in or milestone number becomes a hyperlink\n" "to that check-in or milestone. This hyperlinks only work if the\n" "user has permission to read tickets, check-ins, and/or milestones.\n" "\n" "A pathname for any file in the repository becomes a hyperlink to its\n" "\"rlog\" page. This only works if the user has check-out permissions.\n" "\n" "To create a hyperlink on arbitrary text, use \"{quote: {link: ...}}\"\n" "markup. Any text of the form: \"{quote: {link: URL PHRASE}}\"\n" "displays PHRASE as hyperlink to URL. URL can be an absolute\n" "URL beginning with a prefix like \"http:\", or it can be a\n" "relative URL referring to another page within the same CVSTrac\n" "server. For example, to create a link to a report, one might\n" "write: \"{quote: {link: rptview?rn=1 Active Tickets}}\".\n" "\n" "**Horizontal Lines**\n" "\n" "A horizontal line (the
markup of HTML) is generated\n" "whenever four or more \"-\" characters appear on a line by\n" "themselves.\n" "\n" "**Tables**\n" "\n" "A table is created by starting a line with a \"|\" character, separating each\n" "cell with a \"|\", and ending each row with a \"|\". For example, a 3x3 table is\n" "created with:\n" "\n" " |cell 1|cell 2|cell 3|\n" " |cell 4|cell 5|cell 6|\n" " |cell 7|cell 8|cell 9|\n" "\n" "**Reports**\n" "\n" "A {link: reportlist report} can be embedded on any page using the\n" "\"{quote: {report: rn}}\" markup. A report can have text flow around\n" "it using the \"{quote: {leftreport: rn}}\" or \"{quote: {rightreport: rn}}\"\n" "markups. Note that the report number _rn_ is not the same as the order\n" "in the {link: reportlist report listing}; follow the link for the report\n" "in order to get that.\n" "\n" "**Other Markup Rules**\n" "\n" "The special markup \"{quote: {linebreak}}\" will be rendered\n" "as a line break or hard return. The content of\n" "\"{quote: {quote: ...}}\" markup is shown verbatim.\n" "\n" "{markups}\n" ; static const char zFrequentlyAskedQuestions[] = "If you have a new question, enter it on this page and leave the\n" "_Answer:_ section blank. Someone will eventually add text that\n" "provides an answer. At least, that's the theory...\n" "\n" "_Question:_\n" "Can CVSTrac be run in a chroot jail?\n" "\n" "_Answer:_\n" "See ChrootJailForCvstrac.\n" "\n" "_Question:_\n" "I don't want CVSTrac to change my CVSROOT/passwd file. How do I keep it\n" "from changing that file when I add new users to CVSTrac?\n" "\n" "_Answer:_\n" "CVSTrac will not change the CVSROOT/passwd file if you turn off\n" "write permission on that file. There is also an option under\n" "the Setup menu that an administrator can use to turn off CVSROOT/passwd\n" "writing.\n" "\n" "_Question:_\n" "I have multiple projects in the same CVS repository. How can I set\n" "of separate CVSTrac instances for each project?\n" "\n" "_Answer:_\n" "There is an option under the Setup menu that will cause CVSTrac to\n" "ignore all files whose names do not match a specified prefix.\n" "If all of your projects have distinct prefixes, you can use this\n" "option to restrict each CVSTrac instance to a single project.\n" ; static const char zLocalizationOfCvstrac[] = "*Localization of CVSTrac*\n" "\n" "All the text generated by CVSTrac is American English. But dates can\n" "be displayed in the local language and format.\n" "To show dates in the local language, do this:\n" "\n" "*: Create bash script to run CVSTrac in required locale.\n" " Example : _uk-cvstrac_\n" "\n" " #!/bin/bash\n" " LC_ALL=uk_UA.KOI8-U\n" " export LC_ALL\n" " /usr/local/bin/cvstrac $*\n" "\n" "*: Replace \"cvstrac\" in your scripts by name of your new script\n" " (uk-cvstrac, in my case).\n" "\n" "If you want to run a localized CVSTrac in chroot environment\n" "(such as described in ChrootJailForCvstrac),\n" "use the following command to find all files required by the\n" "cvstrac binary.\n" "\n" " strace -e file cvstrac 2>logfile ...\n" ; static const char zMultipleCvsRepositories[] = "Many people are used to hosting multiple projects in a single\n" "CVS repository. Unfortunately, CVSTrac is not able to deal with\n" "that situation. CVSTrac requires a separate CVS repository for\n" "each project.\n" "\n" "_To_do: Talk about how to set up multiple CVS repositories.\n" "Or maybe refer the user to the CVS documentation on how to do\n" "that._\n" "\n" "If you already have multiple projects in your CVS repository,\n" "you will need to split it into multiple separate repositories.\n" "How to do this is explained at CvsRepositorySplitting.\n" ; static const char zWhatIsWiki[] = "The term \"{quote: WikiWiki}\"\n" "(\"wiki wiki\" means \"quick\" in the Hawaiian language and\n" "is pronounced \"wickee wickee\") can be used to identify either a\n" "type of hypertext document or the software used to write it.\n" "Often called \"wiki\" for short, the collaborative software application\n" "enables web documents to be authored collectively using a simple markup\n" "scheme and without the content being reviewed prior to its acceptance.\n" "The resulting collaborative hypertext document, also called either \"wiki\"\n" "or \"{quote: WikiWikiWeb},\" is typically produced by a community of users.\n" "Many wikis (including this one) are easily identified by their use of\n" "CamelCase hyperlinks.\n" "\n" "The original {quote: WikiWikiWeb} was established in 1995 by Ward Cunningham,\n" "who invented and named the Wiki concept and produced the first\n" "implementation of a {quote: WikiWiki} server. Ward's server is still online\n" "at http://www.c2.com/cgi/wiki. Visit that server for additional\n" "information. Or read a book Ward (and Bo Leuf) wrote on the concept:\n" "_The Wiki Way: Quick collaboration on the Web_, Addison-Wesley,\n" "ISBN-020171499X.\n" "Some people maintain that only Ward's wiki should be called \"Wiki\"\n" "(upper case) or the \"{quote: WikiWikiWeb}\".\n" ; static const char zWikiDocumentation[] = "The following topics are available:\n" "\n" "*: FormattingWikiPages\n" "*: WikiPageNames\n" "*: WhatIsWiki\n" "*: CreatingNewWiki\n" "*: DeleteWiki\n" ; static const char zWikiIndex[] = "This is the default wiki index page that is automatically\n" "created when you initialize a new CVSTrac database.\n" "You should edit this page to include information specific\n" "to your particular CVSTrac installation.\n" "\n" "Where are some links to more information:\n" "\n" "*: FrequentlyAskedQuestions\n" "*: CvstracDocumentation\n" "*: WikiDocumentation\n" "*: CreatingNewWiki\n" ; static const char zWikiPageNames[] = "Wiki pages names are written using CamelCase.\n" "Within a wiki pages, any word written in {quote: CamelCase}\n" "becomes a hyperlink to the wiki page with that same name.\n" "\n" "The formatting rules for wiki page names on this\n" "server are shown below. (Other servers may use minor\n" "variations on these rules.)\n" "\n" "1: The name must consist of alphabetic characters only.\n" " No digits, spaces, punctuation, or underscores.\n" "\n" "2: There must be at least two capital letters in the name.\n" "\n" "3: The first character of the name must be capitalized.\n" "\n" "4: Every capital letter must be followed by one or more\n" " lower-case letters.\n" ; static const struct { const char *zName; const char *zText; } aPage[] = { { "CamelCase", zCamelCase }, { "ChrootJailForCvstrac", zChrootJailForCvstrac }, { "CreatingNewWiki", zCreatingNewWiki }, { "CvsRepositorySplitting", zCvsRepositorySplitting }, { "CvstracAdmin", zCvstracAdmin }, { "CvstracAdminHomePage", zCvstracAdminHomePage }, { "CvstracAdminTicketState", zCvstracAdminTicketState }, { "CvstracAttachment", zCvstracAttachment }, { "CvstracBrowse", zCvstracBrowse }, { "CvstracCheckin", zCvstracCheckin }, { "CvstracDocumentation", zCvstracDocumentation }, { "CvstracFileHistory", zCvstracFileHistory }, { "CvstracFileview", zCvstracFileview }, { "CvstracInspection", zCvstracInspection }, { "CvstracLogin", zCvstracLogin }, { "CvstracMilestone", zCvstracMilestone }, { "CvstracReport", zCvstracReport }, { "CvstracSearch", zCvstracSearch }, { "CvstracTicket", zCvstracTicket }, { "CvstracTimeline", zCvstracTimeline }, { "CvstracWiki", zCvstracWiki }, { "DeleteWiki", zDeleteWiki }, { "FormattingWikiPages", zFormattingWikiPages }, { "FrequentlyAskedQuestions", zFrequentlyAskedQuestions }, { "LocalizationOfCvstrac", zLocalizationOfCvstrac }, { "MultipleCvsRepositories", zMultipleCvsRepositories }, { "WhatIsWiki", zWhatIsWiki }, { "WikiDocumentation", zWikiDocumentation }, { "WikiIndex", zWikiIndex }, { "WikiPageNames", zWikiPageNames }, }; void initialize_wiki_pages(void){ int i; time_t now = time(0); for(i=0; i