Skip to content

Commit b60abf8

Browse files
author
Richard Jones
committed
[[Metadata associated with this commit was garbled during conversion from CVS
to Subversion.]]
1 parent 2017929 commit b60abf8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+27152
-0
lines changed

BUILD.txt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
Building Releases
2+
=================
3+
4+
Roundup is currently a source-only release - it has no binary components. I
5+
want it to stay that way, too.
6+
7+
This means that we only need to ever build source releases. This is done by
8+
running:
9+
10+
1. Edit roundup/__init__.py and doc/announcement.txt to reflect the new
11+
version and appropriate announcements.
12+
2. python setup.py clean --all
13+
3. Edit setup.py to ensure that all information therein (version, contact
14+
information etc) is correct.
15+
4. python setup.py sdist --manifest-only
16+
5. Check the MANIFEST to make sure that any new files are included. If
17+
they are not, edit MANIFEST.in to include them. "Documentation" for
18+
MANIFEST.in may be found in disutils.filelist._parse_template_line.
19+
6. python setup.py sdist
20+
(if you find sdist a little verbose, add "--quiet" to the end of the
21+
command)
22+
23+
So, those commands in a nice, cut'n'pasteable form::
24+
25+
python setup.py clean --all
26+
python setup.py sdist --manifest-only
27+
python setup.py sdist --quiet
28+
29+
or, for the sad RedHat users::
30+
31+
python2 setup.py clean --all
32+
python2 setup.py sdist --manifest-only
33+
python2 setup.py sdist --quiet
34+
35+
36+
Distributing Releases
37+
=====================
38+
39+
Once a release is built, follow these steps:
40+
41+
1. FTP the tar.gz from the dist directory to to the "incoming" directory on
42+
"upload.sourceforge.net".
43+
2. Make a quick release at:
44+
http://sourceforge.net/project/admin/qrs.php?package_id=&group_id=31577
45+
3. Add a news item at:
46+
https://sourceforge.net/news/submit.php?group_id=31577
47+
using the top of doc/announcement.txt
48+
4. Send doc/announcement.txt to [email protected]
49+
5. Notify any other news services as appropriate...
50+
51+
52+
Author
53+
======
54+
55+
56+

CHANGES.txt

Lines changed: 878 additions & 0 deletions
Large diffs are not rendered by default.

MANIFEST.in

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
recursive-include roundup *.* home* page*
2+
recursive-include frontends *.*
3+
recursive-include scripts *.* *-*
4+
recursive-include tools *.*
5+
recursive-include cgi-bin *.cgi
6+
recursive-include test *.py *.txt
7+
recursive-include doc *.html *.png *.txt *.css
8+
recursive-exclude roundup *.pyc *.pyo .cvsignore
9+
recursive-exclude frontends *.pyc *.pyo .cvsignore
10+
include run_tests *.txt
11+
exclude BUILD.txt I18N_PROGRESS.txt TODO.txt
12+
exclude doc/security.txt doc/templating.txt
13+

TODO.txt

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
General Roundup project TODO list. Note that some of these are semi-formed
2+
ideas. Those ideas that don't make the cutoff for the next major release are
3+
punted automatically into the subsequent major release TODO. When stuff is
4+
done, it's moved to the CHANGES file.
5+
6+
======= ========= ============================================================
7+
State Component Description
8+
======= ========= ============================================================
9+
pending example meta/parent bug implementation (feature request #506815)
10+
pending example replace the "extended" example with a "help desk" one, and
11+
rename "classic" to "bug tracker"
12+
pending example script for retrieval of "mbox" archive of all messages
13+
pending hyperdb range searching of values (dates in particular).
14+
Filter specifies {property: (comparison function, value)}
15+
comparison functions: lt, le, eq, ge, gt. eq and
16+
[value, value, ...] implies "in"
17+
pending hyperdb migrate "id" property to be Number type
18+
pending hyperdb multilink sorting by length is dumb
19+
pending hyperdb lastchangedby auto-property giving last user to change an
20+
item
21+
pending hyperdb pysqlite and locks
22+
http://www.hwaci.com/sw/sqlite/c_interface.html
23+
pending tracker split instance.open() into open() and login()
24+
pending mailgw allow commands (feature request #556996)
25+
like "help", "dump issue123" (would send all info about
26+
issue123, including a digest of all messages, but probably
27+
not all files...), "list issue", ...
28+
pending mailgw Allow multiple email addresses at one gw with different
29+
default classes and property values (possibly through
30+
command-line args to the mailgw as invoked in the mail
31+
delivery "aliases" file) eg::
32+
33+
roundup: "|roundup-mailgw /instances/dev"
34+
vmbugs: "|roundup-mailgw /instances/dev component=voicemail"
35+
36+
pending mailgw Identification of users should have a configurable degree of
37+
strictness (ie. turn off username==address matching)
38+
pending mailgw Use in-reply-to for determining message lineage when subject
39+
line lets us down
40+
pending mailgw Allow different brackets delimiting [issueNNN] in Subject
41+
pending email email sig could use a "remove me from this list"
42+
pending messages Snarf the first whole sentence, or full first line of
43+
messages for the summary - whichever is longer.
44+
pending project switch to a Roundup instance for Roundup bug/feature tracking
45+
pending security authenticate over a secure connection
46+
pending security optionally auth with Basic HTTP auth instead of cookies
47+
pending security use digital signatures in mailgw
48+
pending admin "roundup-admin list" should list all the classnames
49+
pending admin the find command in roundup-admin could do more than equality
50+
checks != for instance. Also the ability to check =None.
51+
pending web I18N
52+
pending web Better message summary display (feature request #520244)
53+
pending web Navigating around the issues (feature request #559149)
54+
pending web Quick help links next to the property labels giving a
55+
description of the property. Combine with help for the actual
56+
form element too, eg. how to use the nosy list edit box.
57+
pending web clicking on a group header should filter for that type of
58+
entry
59+
pending web re-enable auth basic http auth
60+
pending web allow multilink selections to select a "none" element to allow
61+
people with broken browsers to select nothing?
62+
pending web add checkbox-based removal/addition for multilink entries
63+
(eg "add me"/"remove me" for nosy list)
64+
pending web search "refinement" - pre-fill the search page with the
65+
current search parameters
66+
pending web column-heading sort stuff isn't implemented
67+
pending web multilink item removal action with retirement
68+
pending web implement a python dict version of the form values
69+
pending web implement the request.url attribute?
70+
pending web query editing isn't fully implemented
71+
pending web UNIX init.d script for roundup-server
72+
======= ========= =============================================================
73+

cgi-bin/roundup.cgi

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
#!/usr/bin/env python
2+
#
3+
# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
4+
# This module is free software, and you may redistribute it and/or modify
5+
# under the same terms as Python, so long as this copyright message and
6+
# disclaimer are retained in their original form.
7+
#
8+
# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
9+
# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
10+
# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
11+
# POSSIBILITY OF SUCH DAMAGE.
12+
#
13+
# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
14+
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15+
# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
16+
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
17+
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
18+
#
19+
# $Id: roundup.cgi,v 1.35 2002-11-06 11:38:42 richard Exp $
20+
21+
# python version check
22+
from roundup import version_check
23+
from roundup.i18n import _
24+
import sys
25+
26+
#
27+
## Configuration
28+
#
29+
30+
# Configuration can also be provided through the OS environment (or via
31+
# the Apache "SetEnv" configuration directive). If the variables
32+
# documented below are set, they _override_ any configuation defaults
33+
# given in this file.
34+
35+
# TRACKER_HOMES is a list of trackers, in the form
36+
# "NAME=DIR<sep>NAME2=DIR2<sep>...", where <sep> is the directory path
37+
# separator (";" on Windows, ":" on Unix).
38+
39+
# Make sure the NAME part doesn't include any url-unsafe characters like
40+
# spaces, as these confuse the cookie handling in browsers like IE.
41+
42+
# ROUNDUP_LOG is the name of the logfile; if it's empty or does not exist,
43+
# logging is turned off (unless you changed the default below).
44+
45+
# ROUNDUP_DEBUG is a debug level, currently only 0 (OFF) and 1 (ON) are
46+
# used in the code. Higher numbers means more debugging output.
47+
48+
# This indicates where the Roundup tracker lives
49+
TRACKER_HOMES = {
50+
'demo': '/var/roundup/trackers/demo',
51+
}
52+
53+
# Where to log debugging information to. Use an instance of DevNull if you
54+
# don't want to log anywhere.
55+
class DevNull:
56+
def write(self, info):
57+
pass
58+
def close(self):
59+
pass
60+
#LOG = open('/var/log/roundup.cgi.log', 'a')
61+
LOG = DevNull()
62+
63+
#
64+
## end configuration
65+
#
66+
67+
68+
#
69+
# Set up the error handler
70+
#
71+
try:
72+
import traceback, StringIO, cgi
73+
from roundup.cgi import cgitb
74+
except:
75+
print "Content-Type: text/plain\n"
76+
print _("Failed to import cgitb!\n\n")
77+
s = StringIO.StringIO()
78+
traceback.print_exc(None, s)
79+
print s.getvalue()
80+
81+
82+
#
83+
# Check environment for config items
84+
#
85+
def checkconfig():
86+
import os, string
87+
global TRACKER_HOMES, LOG
88+
89+
# see if there's an environment var. ROUNDUP_INSTANCE_HOMES is the
90+
# old name for it.
91+
if os.environ.has_key('ROUNDUP_INSTANCE_HOMES'):
92+
homes = os.environ.get('ROUNDUP_INSTANCE_HOMES')
93+
else:
94+
homes = os.environ.get('TRACKER_HOMES', '')
95+
if homes:
96+
TRACKER_HOMES = {}
97+
for home in string.split(homes, os.pathsep):
98+
try:
99+
name, dir = string.split(home, '=', 1)
100+
except ValueError:
101+
# ignore invalid definitions
102+
continue
103+
if name and dir:
104+
TRACKER_HOMES[name] = dir
105+
106+
logname = os.environ.get('ROUNDUP_LOG', '')
107+
if logname:
108+
LOG = open(logname, 'a')
109+
110+
# ROUNDUP_DEBUG is checked directly in "roundup.cgi.client"
111+
112+
113+
#
114+
# Provide interface to CGI HTTP response handling
115+
#
116+
class RequestWrapper:
117+
'''Used to make the CGI server look like a BaseHTTPRequestHandler
118+
'''
119+
def __init__(self, wfile):
120+
self.wfile = wfile
121+
def write(self, data):
122+
self.wfile.write(data)
123+
def send_response(self, code):
124+
self.write('Status: %s\r\n'%code)
125+
def send_header(self, keyword, value):
126+
self.write("%s: %s\r\n" % (keyword, value))
127+
def end_headers(self):
128+
self.write("\r\n")
129+
130+
#
131+
# Main CGI handler
132+
#
133+
def main(out, err):
134+
import os, string
135+
import roundup.instance
136+
path = string.split(os.environ.get('PATH_INFO', '/'), '/')
137+
request = RequestWrapper(out)
138+
request.path = os.environ.get('PATH_INFO', '/')
139+
tracker = path[1]
140+
os.environ['TRACKER_NAME'] = tracker
141+
os.environ['PATH_INFO'] = string.join(path[2:], '/')
142+
if TRACKER_HOMES.has_key(tracker):
143+
# redirect if we need a trailing '/'
144+
if len(path) == 2:
145+
request.send_response(301)
146+
# redirect
147+
if os.environ.get('HTTPS', '') == 'on':
148+
protocol = 'https'
149+
else:
150+
protocol = 'http'
151+
absolute_url = '%s://%s%s/'%(protocol, os.environ['HTTP_HOST'],
152+
os.environ.get('REQUEST_URI', ''))
153+
request.send_header('Location', absolute_url)
154+
request.end_headers()
155+
out.write('Moved Permanently')
156+
else:
157+
tracker_home = TRACKER_HOMES[tracker]
158+
tracker = roundup.instance.open(tracker_home)
159+
from roundup.cgi.client import Unauthorised, NotFound
160+
client = tracker.Client(tracker, request, os.environ)
161+
try:
162+
client.main()
163+
except Unauthorised:
164+
request.send_response(403)
165+
request.send_header('Content-Type', 'text/html')
166+
request.end_headers()
167+
out.write('Unauthorised')
168+
except NotFound:
169+
request.send_response(404)
170+
request.send_header('Content-Type', 'text/html')
171+
request.end_headers()
172+
out.write('Not found: %s'%client.path)
173+
174+
else:
175+
import urllib
176+
request.send_response(200)
177+
request.send_header('Content-Type', 'text/html')
178+
request.end_headers()
179+
w = request.write
180+
w(_('<html><head><title>Roundup trackers index</title></head>\n'))
181+
w(_('<body><h1>Roundup trackers index</h1><ol>\n'))
182+
homes = TRACKER_HOMES.keys()
183+
homes.sort()
184+
for tracker in homes:
185+
w(_('<li><a href="%(tracker_url)s/index">%(tracker_name)s</a>\n')%{
186+
'tracker_url': os.environ['SCRIPT_NAME']+'/'+
187+
urllib.quote(tracker),
188+
'tracker_name': cgi.escape(tracker)})
189+
w(_('</ol></body></html>'))
190+
191+
#
192+
# Now do the actual CGI handling
193+
#
194+
out, err = sys.stdout, sys.stderr
195+
try:
196+
# force input/output to binary (important for file up/downloads)
197+
if sys.platform == "win32":
198+
import os, msvcrt
199+
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
200+
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
201+
checkconfig()
202+
sys.stdout = sys.stderr = LOG
203+
main(out, err)
204+
except SystemExit:
205+
pass
206+
except:
207+
sys.stdout, sys.stderr = out, err
208+
out.write('Content-Type: text/html\n\n')
209+
cgitb.handler()
210+
sys.stdout.flush()
211+
sys.stdout, sys.stderr = out, err
212+
LOG.close()
213+
214+
# vim: set filetype=python ts=4 sw=4 et si

doc/.cvsignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
announcement.html
2+
customizing.html
3+
developers.html
4+
implementation.html
5+
index.html
6+
installation.html
7+
user_guide.html
8+
FAQ.html
9+
security.html
10+
features.html
11+
upgrading.html
12+
glossary.html
13+
design.html
14+
maintenance.html

0 commit comments

Comments
 (0)