debian/0000755000000000000000000000000012045441005007161 5ustar debian/roundup.logrotate0000644000000000000000000000023612045441005012600 0ustar # Logrotate file for roundup /var/log/roundup/*.log { compress delaycompress weekly missingok rotate 5 notifempty } debian/dh_installoverrides0000644000000000000000000000262512045441005013155 0ustar #!/usr/bin/perl -w # # dh_installoverrides =head 1 NAME dh_installoverrides = install lintian/linda override files =cut use strict; use Debian::Debhelper::Dh_Lib; =head 1 SYNOPSIS B =head1 DESCRIPTION dh_installoverrides is a debhelper program that is responsible for installing lintian and linda overrides into package build directories. If a file named debian/package.lintian exists, it is installed into /usr/share/lintian/overrides/package. If a file named debian/package.linda exists, it is installed into /usr/share/linda/overrides/package. =cut init(); foreach my $package (@{$dh{DOPACKAGES}}) { my $tmp=tmpdir($package); my $file=$package; my $lintian_overrides=pkgfile($package,"lintian"); my $linda_overrides=pkgfile($package,"linda"); if($lintian_overrides ne '') { if(! -d "$tmp/usr/share/lintian/overrides") { doit("install", "-d", "$tmp/usr/share/lintian/overrides"); } doit("install","-p","-m644",$lintian_overrides, "$tmp/usr/share/lintian/overrides/$file"); } if($linda_overrides ne '') { if (! -d "$tmp/usr/share/linda/overrides") { doit("install", "-d", "$tmp/usr/share/linda/overrides"); } doit("install", "-p", "-m644", $linda_overrides, "$tmp/usr/share/linda/overrides/$file"); } } =head1 SEE ALSO L This program is a part of debhelper =head1 AUTHOR Rene Engelhard =cut debian/copyright0000644000000000000000000001123512045441005011116 0ustar This package was debianized by Bastian Kleineidam on Thu, 16 Jan 2003 19:39:45 +0100. Homepage: http://roundup.sourceforge.net/ The current download page is on PYPI: http://pypi.python.org/pypi/roundup Upstream Author: Richard Jones Copyright: Roundup Licensing ----------------- Copyright (c) 2003-2009 Richard Jones (richard@mechanicalcat.net) Copyright (c) 2002 eKit.com Inc (http://www.ekit.com/) Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PageTemplates Licensing ----------------------- Portions of this code (roundup.cgi.PageTemplates, roundup.cgi.TAL and roundup.cgi.ZTUtils) have been copied from Zope. They have been modified in the following manner: - removal of unit tests, Zope-specific code and support files from PageTemplates: PageTemplateFile.py, ZPythonExpr.py, ZRPythonExpr.py, ZopePageTemplate.py, examples, help, tests, CHANGES.txt, HISTORY.txt, version.txt and www. From TAL: DummyEngine.py, HISTORY.txt, CHANGES.txt, benchmark, driver.py, markbench.py, ndiff.py, runtest.py, setpath.py, tests and timer.py. From ZTUtils: SimpleTree.py, Zope.py, CHANGES.txt and HISTORY.txt. - editing to remove dependencies on Zope modules (see files for change notes) The license for this code is the `Zope Public License (ZPL) Version 2.0`_, included below. Zope Public License (ZPL) Version 2.0 ------------------------------------- This software is Copyright (c) Zope Corporation (tm) and Contributors. All rights reserved. This license has been certified as open source. It has also been designated as GPL compatible by the Free Software Foundation (FSF). Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions in source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name Zope Corporation (tm) must not be used to endorse or promote products derived from this software without prior written permission from Zope Corporation. 4. The right to distribute this software or to use it for any purpose does not give you the right to use Servicemarks (sm) or Trademarks (tm) of Zope Corporation. Use of them is covered in a separate agreement (see http://www.zope.com/Marks). 5. If any files are modified, you must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. Disclaimer THIS SOFTWARE IS PROVIDED BY ZOPE CORPORATION ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ZOPE CORPORATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of contributions made by Zope Corporation and many individuals on behalf of Zope Corporation. Specific attributions are listed in the accompanying credits file. debian/roundup-server.ini0000644000000000000000000000067412045441005012671 0ustar # Server configuration file, see # /usr/share/doc/roundup/admin_guide.txt.gz for details [main] port = 8088 host = localhost user = roundup # Please don't disable the pid file: pidfile = /var/run/roundup/server.pid logfile = /var/log/roundup/roundup.log [trackers] # examples, install your own here, or otherwise roundup will not start: # tracker1 = /var/lib/roundup/trackers/notracker1 # tracker2 = /var/lib/roundup/trackers/notracker2 debian/service/0000755000000000000000000000000012045441005010621 5ustar debian/service/run0000644000000000000000000000201412045441005011345 0ustar #!/bin/sh exec 2>&1 # Note that `notracker1` and 'notracker2' are just examples. Change # them to the installed tracker name(s). See roundup-server(1) for # more info if [ -f /etc/default/roundup ]; then . /etc/default/roundup fi # Take these values from /etc/default/roundup: # PORT, USER, TRACKERS, but override them all in case of having a CONFFILE # # TRACKERS must be set to a list of trackers in one string. Example: # TRACKERS=${TRACKERS:=notracker1=/var/lib/roundup/notracker1 notracker2=/var/lib/roundup/notracker2} # # If you can, use the server config file instead (except for the USER variable) CONFFILE=/etc/roundup/roundup-server.ini OPTS="-D" if [ X${PORT} != X ]; then OPTS="${OPTS} -p ${PORT}" fi if [ -f ${CONFFILE} ]; then OPTS="${OPTS} -C ${CONFFILE}" fi if [ X${USER} != X ]; then chown -R ${USER} /var/lib/roundup/trackers chown -R ${USER} /var/run/roundup chown -R ${USER} /var/log/roundup UOPT="chpst -u ${USER}" fi echo "starting roundup server" exec $UOPT roundup-server ${OPTS} ${TRACKERS} debian/service/log/0000755000000000000000000000000012045441005011402 5ustar debian/service/log/run0000644000000000000000000000005412045441005012130 0ustar #!/bin/sh exec svlogd -t /var/log/roundup debian/README.source0000644000000000000000000000003612045441005011337 0ustar This package is using quilt. debian/roundup.init0000755000000000000000000000432512045441005011551 0ustar #!/bin/sh -e # # roundup Startup script for the roundup http server. # # Version: $Id$ # ### BEGIN INIT INFO # Provides: roundup # Required-Start: $syslog $network $remote_fs # Required-Stop: $syslog $network $remote_fs # Should-Start: $local_fs # Should-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start the stand-alone roundup HTTP server # Description: Start the stand-alone roundup HTTP server ### END INIT INFO DESC='Roundup HTTP-Server' BINFILE=roundup-server EXECUTABLE=/usr/bin/$BINFILE ### to be taken from /etc/roundup/roundup-server.ini: #PIDFILE=/var/run/roundup/server.pid #LOGFILE=/var/log/roundup/roundup.log CONFFILE=/etc/roundup/roundup-server.ini # short circuit this init script in case the user prefers runit: NOINIT=0 if test -f /etc/default/roundup; then . /etc/default/roundup fi USERUNIT=${USERUNIT:=0} if [ ${USERUNIT} -eq 1 ] && [ -d /var/service ]; then # make sure there is a runit link present: if [ ! -e /var/service/roundup ]; then ln -s /etc/roundup/service /var/service/roundup fi NOINIT=1 fi EXTRAOPTS="" if [ X${USER} != X ]; then OPTIONS="-- -u ${USER:=roundup} $EXTRAOPTS -C ${CONFFILE}" else OPTIONS="-- $EXTRAOPTS -C ${CONFFILE}" fi test -x $EXECUTABLE || exit 0 start_stop() { case "$1" in start) printf "Starting $DESC:" install -o root -g root -m 755 -d /var/run/roundup install -o root -g root -m 755 -d /var/run/roundup.log if [ ! -e $PIDFILE ]; then start-stop-daemon --start --oknodo --quiet \ --pidfile $PIDFILE \ --exec $EXECUTABLE $OPTIONS printf " $BINFILE" else echo "$PIDFILE exists - make sure that there is no other roundup" echo "instance running. Bailing out..." exit 1 fi printf ".\n" ;; stop) printf "Stopping $DESC:" start-stop-daemon --stop --oknodo --quiet \ --pidfile $PIDFILE rm -f $PIDFILE printf " $BINFILE" printf ".\n" ;; restart | force-reload) start_stop stop sleep 1 start_stop start ;; *) printf "Usage: $0 {start|stop|restart|force-reload}\n" >&2 exit 1 ;; esac } if [ ${NOINIT} -eq 1 ]; then roundup-ctl "$@" else start_stop "$@" fi exit 0 debian/watch0000644000000000000000000000022012045441005010204 0ustar # watch control file for uscan version=3 http://cheeseshop.python.org/packages/source/r/roundup/ roundup-([\d+\.]+|\d+).tar.gz.* debian uupdate debian/roundup-ctl.10000644000000000000000000000242012045441005011515 0ustar .TH ROUNDUP-CTL 1 "31 May 2004" .SH NAME roundup-ctl \- roundup server control interface .SH SYNOPSIS \fBroundup-ctl\fP [\fIoptions\fP] \fIcommand\fP .SH DESCRIPTION \fBroundup-ctl\fP is a front end to the roundup server. It is designed to help the administrator control the functioning of the roundup server daemon. This script mimics most of the behaviour of a regular init script, but works as a front end to the runit package to control the roundup service. So, in order to use this, you need the runit package, too. Please note that using this script is mostly incompatible with having roundup controlled by runit directly in the form of automatic startup. The roundup-ctl script returns a 0 exit value on success, and >0 if an error occurs. For more details, view the comments in the script. .SH OPTIONS .TP \-d \fIdirectory\fP Use given directory as service directory. .SH COMMANDS The \fIcommand\fP can be any one or more of the following options: .TP \fBstart\fP If the roundup server is not runinng, start it. If the server stops, restart it. \fBstop\fP Stops the roundup server. \fBstatus\fP Print status of the roundup server. .SH "SEE ALSO" roundup-server(1) runsvctrl(8) runsvstat(8) svwaitdown(8) .SH AUTHOR Bastian Kleineidam , Toni Mueller debian/control0000644000000000000000000000163012045441005010564 0ustar Source: roundup Section: web Priority: optional Build-Depends-Indep: python (>= 2.6.6-3~), debhelper (>= 7.4) Maintainer: Kai Storbeck Uploaders: Toni Mueller Homepage: http://www.roundup-tracker.org/ Standards-Version: 3.9.3 X-Python-Version: >= 2.5 Package: roundup Architecture: all Depends: ${python:Depends}, ${misc:Depends} Suggests: python-gdbm, python-psycopg2, python-mysqldb, runit, libapache2-mod-python, python-tz, python-xapian, python-openssl, python-pyme Recommends: libjs-jquery Description: an issue-tracking system Simple-to-use and -install issue-tracking system with command-line, web and e-mail interfaces. It is based on the winning design from Ka-Ping Yee in the Software Carpentry "Track" design competition. . If you install one or more of the suggested database interface packages, you will be able to store tracker data in the corresponding database. debian/changelog0000644000000000000000000005773612045441005011055 0ustar roundup (1.4.20-1.1) unstable; urgency=low * Non-maintainer upload. * Remove conffiles only on purge. Fix "deletes conffiles during postrm remove (policy 10.7.3)" as roundup removed /etc/init.d/roundup, /etc/init.d/roundup-dirs and init script links also on remove, abort-install and disappear calls to postrm. (Closes: #689257) -- Salvatore Bonaccorso Wed, 10 Oct 2012 16:07:43 +0200 roundup (1.4.20-1) unstable; urgency=low * New upstream release. * New Maintainer: Kai Storbeck * Incorporated previous NMU by Gregor Herrmann and Daniel T Chen * patch history-user-escape: dropped - applied upstream (fixed in 1.4.20, issue2550684) * patch fix-email-representation: dropped - applied upstream (fixed in 1.4.19, issue2550691) (1.4.18-1 stated to fix issue2550540, but meant issue2550691) * patch debian-changes-1.4.18-1: dropped - correct a packaging mistake * patch 12_manpage_hyphen_minus.patch: created - correct a lintian warning about upstream manpages * patch 00_licensefiles: created - to correct a lintian warning about upstream license files * fix debian native manpages for the same lintian warnings * Upped standards-version to 2.9.3 * CDBS dropped in favour of debhelper and dh_python2 * Supply a symlink to libjs-jquery's jquery.js -- Kai Storbeck Thu, 14 Jun 2012 22:09:29 +0200 roundup (1.4.18-1.1) unstable; urgency=low [ gregor herrmann ] * Non-maintainer upload. [ Daniel T Chen ] * debian/roundup.postrm: Remove obsolete --quiet option passed to userdel and groupdel. (Closes: #640588) -- gregor herrmann Wed, 09 Nov 2011 19:36:27 +0100 roundup (1.4.18-1) unstable; urgency=medium * new upstream 1.4.18 (closes: #605882) * closes several security holes * replaced deluser and delgroup by userdel and groupdel, thanks to Holger Levsen (closes: #616637). * added debian/pyversions, but a little stricter than upstream * unified included jQuery libraries to be 1.4.2, but ignore the existing Debian package for the moment. * Fixes for upstream issues 2550540 and 2550684 -- Toni Mueller Tue, 14 Jun 2011 15:20:29 +0200 roundup (1.4.15-3) unstable; urgency=low * Fix typo (closes upstream issue 2550665) The typo prevents users from registering. -- Toni Mueller Tue, 17 Aug 2010 21:41:10 +0200 roundup (1.4.15-2) unstable; urgency=medium * fixing programming errors, upstream issue 2550661 * correcting packaging error which omitted several conffiles -- Toni Mueller Sun, 08 Aug 2010 17:52:11 +0200 roundup (1.4.15-1) unstable; urgency=low * New upstream * Switch to dpkg-source 3.0 (quilt) format * Appropriated patches which predate my maintainership of this package (sorry, I'm still fighting with the tools). Please send corrections my way. -- Toni Mueller Sat, 07 Aug 2010 16:47:00 +0200 roundup (1.4.13-3.1) unstable; urgency=medium * Non-maintainer upload. * Fix CVE-2010-2491 (Closes: #590769) -- Moritz Muehlenhoff Thu, 29 Jul 2010 21:52:01 -0400 roundup (1.4.13-3) unstable; urgency=low * adapt to new Xapian API, thanks to Olly Betts (closes: #579927) -- Toni Mueller Sun, 02 May 2010 17:36:05 +0200 roundup (1.4.13-2) unstable; urgency=low * unbreak upgrades * remove reference to Sqlite2 (closes: #577184) * adapt the README.Debian to the current state of affairs (closes: #577186) -- Toni Mueller Sat, 24 Apr 2010 22:54:28 +0200 roundup (1.4.13-1) unstable; urgency=low * new upstream -- Toni Mueller Sun, 04 Apr 2010 01:45:05 +0200 roundup (1.4.11-2) unstable; urgency=low * remove additional init.d script on uninstall -- Toni Mueller Fri, 15 Jan 2010 18:01:10 +0100 roundup (1.4.11-1) unstable; urgency=high * new upstream * fixes a security hole * amended README.Debian (closes: #284394) -- Toni Mueller Thu, 24 Dec 2009 15:27:20 +0100 roundup (1.4.10-2) unstable; urgency=low * fixed a typo -- Toni Mueller Wed, 02 Dec 2009 18:42:53 +0100 roundup (1.4.10-1) unstable; urgency=low * New upstream -- Toni Mueller Tue, 01 Dec 2009 10:31:23 +0100 roundup (1.4.9-0) unstable; urgency=high * New upstream, fixes several functional and security problems. For the full list of changes, including security fixes, most of which don't have a CVE number attached, please see upstream's CHANGES.txt file. Closes: #529832, #523516, #540629 * Added the old 'detectors' examples from earlier roundup versions (upstream issue #2550574) back in. -- Toni Mueller Mon, 10 Aug 2009 10:09:11 +0200 roundup (1.4.4-3) unstable; urgency=medium * fixing compatibility with PostgreSQL 8.3 (closes: #510342) * man page structural typo (closes: #509969) * fix roundup-demo argument parsing (closes: #509973) * create temporary directory (pidfile etc) (closes: #506004) -- Toni Mueller Mon, 19 Jan 2009 01:03:47 +0100 roundup (1.4.4-2) unstable; urgency=low * corrected a packaging error -> non-native package * updated to new standards version 3.8.0 * now suggests python-openssl * closing obsolete bugs (Closes: #450690) * closing obsolete bugs (Closes: #450690) * closing obsolete bugs (Closes: #450690) -- Toni Mueller Sun, 20 Jul 2008 19:24:51 +0200 roundup (1.4.4-1.1) unstable; urgency=high * Non-maintainer upload by the Security Team. * Fix privilege escalation leading to attackers being able to edit or view restricted properties via the "list", "display" and "set methods (10-CVE-2008-1475.dpatch; Closes: #484728). -- Nico Golde Sat, 07 Jun 2008 10:02:05 +0200 roundup (1.4.4-1) unstable; urgency=medium * new upstream * fixes security problem CVE-2008-1474 (Closes: #472643) * reworked postinst to conditionally use update-service (Closes: #466381) -- Toni Mueller Tue, 01 Apr 2008 15:49:45 +0200 roundup (1.4.1-1) unstable; urgency=low * new upstream (closes: #450690) * added more suggested packages (closes: #434957) * suppress bogus error message (closes: #434945) -- Toni Mueller Wed, 2 Jan 2008 22:42:57 +0100 roundup (1.3.3-3) unstable; urgency=low * fixed uid bug again (the fix in 1.3.3-2 was non-functional) * transion experimental -> unstable * checked included scripts (closes: #426484) -- Toni Mueller Wed, 23 May 2007 15:21:28 +0200 roundup (1.3.3-2) experimental; urgency=low * removed obsolete Python versioning declaration * pulled in fix for #414973 which was also present in this version * re-packaged source (closes: #414951) -- Toni Mueller Sun, 18 Mar 2007 18:07:39 +0100 roundup (1.3.3-1) experimental; urgency=low * new upstream (closes: #402711) -- Toni Mueller Sun, 4 Mar 2007 00:55:33 +0100 roundup (1.2.1-9) unstable; urgency=low * make packaging scripts more tolerant (closes: #414973) -- Toni Mueller Sun, 4 Mar 2007 23:06:50 +0100 roundup (1.2.1-8) unstable; urgency=low * fixed build dependencies -- Toni Mueller Sun, 4 Mar 2007 00:52:46 +0100 roundup (1.2.1-7) unstable; urgency=medium * fixed a serious packaging error -- Toni Mueller Sat, 3 Mar 2007 14:34:45 +0100 roundup (1.2.1-6) unstable; urgency=low * added user creation/deletion (closes: #406662) * init script reworked (closes: #402826) -- Toni Mueller Sat, 3 Mar 2007 12:17:08 +0100 roundup (1.2.1-5) unstable; urgency=medium * fixed configuration and service files (closes: #398226) * fixed missing tracker dirs * extract parts of the tracker config to /etc/default/roundup (idea by Izak Burger, thank you!) * adapted roundup.lintian to the new Python policy * added back missing man pages * updated roundp-ctl to reflect recent changes in runit * unified runit and init.d scripts wrt. configuration and logging * unified ports between init.d script and service run script (but the runit version is still not operable, thanks to roundup-server forking) * changed log file location * correct apache config example (closes: #400679) * added an option -D to prevent forking, currently mostly untested * corrected some packaging errors -- Toni Mueller Tue, 28 Nov 2006 15:25:31 +0100 roundup (1.2.1-4) unstable; urgency=low * install man pages in the correct locations (Closes: #392310) -- Toni Mueller Wed, 11 Oct 2006 13:19:16 +0200 roundup (1.2.1-3) unstable; urgency=low * fixed dependencies: no python2.2 anymore (Closes: #392075) -- Toni Mueller Tue, 10 Oct 2006 15:07:23 +0200 roundup (1.2.1-2) unstable; urgency=low * fixed overwriting doc/index.html -- Toni Mueller Sun, 8 Oct 2006 22:21:34 +0200 roundup (1.2.1-1) unstable; urgency=low * new upstream -- Toni Mueller Sat, 7 Oct 2006 19:04:25 +0200 roundup (1.1.2-5) unstable; urgency=low * removed cruft -- Toni Mueller Mon, 14 Aug 2006 22:16:39 +0200 roundup (1.1.2-4) unstable; urgency=low * Closes: #379997 * Closes: #375840 -- Toni Mueller Sun, 13 Aug 2006 12:04:24 +0200 roundup (1.1.2-3) unstable; urgency=low * switched to cdbs * support new Python policy using python-central -- Toni Mueller Sat, 15 Jul 2006 14:47:49 +0200 roundup (1.1.2-2) unstable; urgency=low * modified debian/rules (closes: #375840) -- Toni Mueller Sat, 15 Jul 2006 14:46:33 +0200 roundup (1.1.2-1) unstable; urgency=low * new upstream * updated to cgi-lib according to policy * removed illegal 'local' part from start script (Closes: #365054) * don't start if no trackers are defined * actually do add index.html to doc directory * updated to standards version 3.7.2 -- Toni Mueller Mon, 22 May 2006 23:57:32 +0200 roundup (1.1.1-0) unstable; urgency=low * new upstream * new download area: SF -> Python Cheeseshop -- Toni Mueller Sat, 4 Mar 2006 22:45:11 +0100 roundup (1.1.0-1) unstable; urgency=low * new upstream -- Toni Mueller Sun, 12 Feb 2006 20:13:00 +0100 roundup (0.8.4-6) unstable; urgency=low * corrected packaging error -- Toni Mueller Mon, 9 Jan 2006 22:05:33 +0100 roundup (0.8.4-5) unstable; urgency=low * Exim4 specific installation tips (Closes: #343283) * config.py -> config.ini (Closes: #345600) -- Toni Mueller Mon, 9 Jan 2006 13:04:41 +0100 roundup (0.8.4-3) unstable; urgency=low * clarified installation instructions * user error ignored (Closes: #324389) * New Maintainer (Closes: #324557) -- Toni Mueller Thu, 22 Dec 2005 23:06:55 +0100 roundup (0.8.4-2) unstable; urgency=low * Orphaning the package (see #324557) * Use new watch file format and qa.debian SF redirector -- Bastian Kleineidam Mon, 29 Aug 2005 11:44:29 +0200 roundup (0.8.4-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Mon, 18 Jul 2005 10:06:39 +0200 roundup (0.8.3-2) unstable; urgency=low * Fixed german translation, thanks to Jens Seidel for the patch. (Closes: #313700) * bump up standards version to 3.6.2.1 -- Bastian Kleineidam Tue, 5 Jul 2005 22:26:33 +0200 roundup (0.8.3-1) unstable; urgency=low * New upstream release. * Remove references to old init.d directory in roundup-ctl. * Install upstream roundup.cgi file with the configuration split off into /etc/roundup/cgiconf.py -- Bastian Kleineidam Mon, 2 May 2005 11:32:34 +0200 roundup (0.8.2-1) unstable; urgency=low * New upstream release. * Upload to unstable (enough bugs fixed in this release). * Added mod_python installation doc in README.Debian -- Bastian Kleineidam Wed, 16 Feb 2005 10:58:01 +0100 roundup (0.7.11+0.8.0b2-1) experimental; urgency=low * New upstream release. -- Bastian Kleineidam Wed, 9 Feb 2005 15:07:00 +0100 roundup (0.7.11-3) unstable; urgency=low * Add detector examples (Closes: #294333) -- Bastian Kleineidam Wed, 9 Feb 2005 14:03:03 +0100 roundup (0.7.11-2) unstable; urgency=low * Updated metakit package name -- Bastian Kleineidam Tue, 1 Feb 2005 18:04:59 +0100 roundup (0.7.11-1) unstable; urgency=medium * New upstream release. Upstream says that this should be the last 0.7.x release, so pushing this into sarge is not a bad idea. Urgency medium. * patch 07_send_file_fix: dropped - applied upstream -- Bastian Kleineidam Fri, 7 Jan 2005 16:42:21 +0100 roundup (0.7.10-1) unstable; urgency=low * New upstream release. - the orig.tar.gz is repacked without the superfluous CVS file roundup/backends/.#rdbms_common.py.1.98.2.29 * patch 06_roundup_typo: dropped - applied upstream * patch 07_send_file_fix: new - catch NotModified exception when try to send files Thanks to Alexander Goldstein for the patch. (Closes: #286727) * patch 08_update_manpages: new - updated man pages for roundup-* commands -- Bastian Kleineidam Tue, 4 Jan 2005 11:30:05 +0100 roundup (0.7.9-4) unstable; urgency=low * README.Debian: added paragraph about long running Python processes, and moved backend paragraph into a separate list item. -- Bastian Kleineidam Mon, 6 Dec 2004 14:58:43 +0100 roundup (0.7.9-3) unstable; urgency=low * Typo-fix from Ben Finney (Closes: #283770) -- Bastian Kleineidam Wed, 1 Dec 2004 11:05:18 +0100 roundup (0.7.9-2) unstable; urgency=low * Added patches from Bernhard Reiter to fix some typos and documentation issues. Thanks! (Closes: #283315) -- Bastian Kleineidam Mon, 29 Nov 2004 01:42:56 +0100 roundup (0.7.9-1) unstable; urgency=low * New upstream release. * Updated man pages. -- Bastian Kleineidam Fri, 26 Nov 2004 11:14:50 +0100 roundup (0.7.8-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Fri, 15 Oct 2004 01:28:57 +0200 roundup (0.7.7-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Wed, 13 Oct 2004 10:15:13 +0200 roundup (0.7.6-2) unstable; urgency=low * fix debian/watch url -- Bastian Kleineidam Wed, 28 Jul 2004 16:18:59 +0200 roundup (0.7.6-1) unstable; urgency=low * New upstream release. * Remove duplicate upstream changelog CHANGES.txt.gz, leave only changelog.gz -- Bastian Kleineidam Wed, 21 Jul 2004 10:18:08 +0200 roundup (0.7.5-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Thu, 24 Jun 2004 14:52:19 +0200 roundup (0.7.4-1) unstable; urgency=low * New upstream release. * remove patch 06_int_date_seconds applied upstream -- Bastian Kleineidam Thu, 10 Jun 2004 10:01:01 +0200 roundup (0.7.3-4) unstable; urgency=low * added upgrading documentation to debian/NEWS (Closes: #252629) * new patch 06_int_date_seconds to convert seconds from float to int before calling strftime(), thanks Brian McGroarty for noticing (Closes: #252839) -- Bastian Kleineidam Mon, 7 Jun 2004 21:38:24 +0200 roundup (0.7.3-3) unstable; urgency=low * added more example scripts (Closes: #251849), thanks Bernhard Reiter * add documentation how to setup a standalone web gateway with roundup-server and the runit package (Closes: #246533) * add runit to the suggested packages, and add all scripts and directories to run as a runit daemon including a new roundup-ctl control script -- Bastian Kleineidam Mon, 31 May 2004 18:58:18 +0200 roundup (0.7.3-2) unstable; urgency=low * fix paths of documentation files in README.Debian; thanks Marius Gedminas for spotting it (Closes: #251457) -- Bastian Kleineidam Fri, 28 May 2004 19:21:58 +0200 roundup (0.7.3-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Fri, 28 May 2004 09:14:54 +0200 roundup (0.7.2-2) unstable; urgency=low * add lintian warnings override -- Bastian Kleineidam Sat, 22 May 2004 15:25:39 +0200 roundup (0.7.2-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Fri, 21 May 2004 09:56:26 +0200 roundup (0.7.1-1) unstable; urgency=low * New upstream release. + removed 06_fix_manifest applied upstream + removed 07_fix_tracker_home applied upstream + removed 08_rfc822_crlf applied upstream -- Bastian Kleineidam Mon, 10 May 2004 09:58:31 +0200 roundup (0.7.0-1) unstable; urgency=low * New upstream release (Closes: #247664) * added 06_fix_manifest to remove stray .orig from source file list * added 07_fix_tracker_home to fix a var reference self.tracker_home * added 08_rfc822_crlf to define missing CRLF in included rfc822.py * adjusted and improved tracker install docs in README.Debian * Put all supported database interfaces into suggest list, add a note into the package description about those suggestions * added debian/roundup.doc-base for HTML documentation -- Bastian Kleineidam Thu, 6 May 2004 15:20:05 +0200 roundup (0.6.9-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Sun, 18 Apr 2004 22:04:52 +0200 roundup (0.6.8-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Thu, 1 Apr 2004 08:51:19 +0200 roundup (0.6.7-1) unstable; urgency=low * New upstream release. - displays more user-friendly error messages on false input data (Closes: #228287) -- Bastian Kleineidam Mon, 1 Mar 2004 09:34:30 +0100 roundup (0.6.6-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Wed, 25 Feb 2004 01:15:37 +0100 roundup (0.6.5-1) unstable; urgency=low * New upstream release. -- Bastian Kleineidam Tue, 17 Feb 2004 20:47:22 +0100 roundup (0.6.4-2) unstable; urgency=low * suggest python database modules gdbm and sqlite -- Bastian Kleineidam Mon, 19 Jan 2004 14:48:38 +0100 roundup (0.6.4-1) unstable; urgency=low * New upstream release. - fixes dates showing "tomorrow" instead of "yesterday" (see also SF bug 853345) (Closes: #222857) -- Bastian Kleineidam Tue, 16 Dec 2003 22:27:52 +0100 roundup (0.6.3.1-1) unstable; urgency=low * New upstream release (CHANGES.txt claims to be version 0.6.4, but orig.tar.gz says it's 0.6.3.1) * removed 07_close_imp_filehandle applied upstream * removed 08_no_anonymous_edit applied upstream -- Bastian Kleineidam Fri, 14 Nov 2003 11:03:10 +0100 roundup (0.6.2-3) unstable; urgency=high * New patch (see SF bug #828901): - 08_no_anonymous_edit Do not allow the anonymous user to edit the username. Security consequences, thus urgency high (Closes: #217234) Thanks Thomas Arendsen Hein for the patch. -- Bastian Kleineidam Fri, 24 Oct 2003 16:18:04 +0200 roundup (0.6.2-2) unstable; urgency=low * Added the Zope frontend ZRoundup to examples, and refer to its installation docs in README.Debian (Closes: #214472) * added debian/watch file for uscan -- Bastian Kleineidam Tue, 7 Oct 2003 20:33:58 +0200 roundup (0.6.2-1) unstable; urgency=low * New upstream release. * removed patches applied upstream: - 06_roundup_server_homes - 08_fix_imp_path * updated patches: - 01_separate_config - 07_close_imp_filehandle -- Bastian Kleineidam Mon, 29 Sep 2003 10:51:12 +0200 roundup (0.6.1-2) unstable; urgency=low * patch 05_roundup_server_umask: set umask to 0077, not 0 * patch 06_roundup_server_homes: delete the example tracker home * patch 07_close_imp_filehandle: close filehandle after import module file * patch 08_fix_imp_path: set absolute path for importing, else the compiled .pyo file ends up in the current directory -- Bastian Kleineidam Thu, 4 Sep 2003 19:41:34 +0200 roundup (0.6.1-1) unstable; urgency=low * New upstream version. - web forms do not bail out on first invalid value (Closes: #193843) - for upgrading your roundup data from old versions (<< 0.6.0), see /usr/share/doc/roundup/upgrading.html * remove 02_multilink_sort included upstream * remove 03_python23_warning included upstream * removed debian/*.1 man pages, they are included upstream now, added 04_fix_man_path to put them in the correct place -- Bastian Kleineidam Tue, 26 Aug 2003 20:16:16 +0200 roundup (0.5.9-3) unstable; urgency=low * do not clobber the python path in roundup.cgi (Closes: #205620) urgency still low, as -2 is not in testing -- Bastian Kleineidam Fri, 15 Aug 2003 22:19:03 +0200 roundup (0.5.9-2) unstable; urgency=low * use and require Python 2.3 * call dh_python * new patch 02_python23_warning: fix FutureWarning with hex constant -- Bastian Kleineidam Mon, 11 Aug 2003 16:41:52 +0200 roundup (0.5.9-1) unstable; urgency=low * New upstream release. * Standards version 3.6.0, no changes needed -- Bastian Kleineidam Sun, 20 Jul 2003 00:23:49 +0200 roundup (0.5.8-3) unstable; urgency=low * do not compress roundup.cgi example * Suggest a local web server for a user-installation web gateway. Make a note that usage of roundup.cgi for user-installations needs write access for the www-data user in the tracker home (Closes: #199132) -- Bastian Kleineidam Tue, 1 Jul 2003 20:15:54 +0200 roundup (0.5.8-2) unstable; urgency=low * new patch 02_mulitlink_sort: sort multilinks with same size by content, backported from CVS HEAD (Closes: #198426) Thanks to Brian McGroarty for pointing this out. -- Bastian Kleineidam Tue, 24 Jun 2003 23:15:36 +0200 roundup (0.5.8-1) unstable; urgency=high * New upstream release. This is the fixed upstream tarball from http://osdn.dl.sourceforge.net/roundup/roundup-0.5.8-2.tar.gz * Urgency high as this fixes a cross-site-scripting security issue * use dpatch for applied patches 01_separate_config - put cgi config into separate file in /etc -- Bastian Kleineidam Thu, 19 Jun 2003 15:40:29 +0200 roundup (0.5.7debian-3) unstable; urgency=low * Standards version 3.5.10 (no changes) * Add python2.2-csv dependency (Closes: #196010) -- Bastian Kleineidam Wed, 4 Jun 2003 13:20:39 +0200 roundup (0.5.7debian-2) unstable; urgency=low * add missingok to logrotate config (Closes: #194838) -- Bastian Kleineidam Tue, 27 May 2003 12:29:51 +0200 roundup (0.5.7debian-1) unstable; urgency=low * set execute permissions on roundup.cgi (Closes: #193892) * split out roundup.cgi conf in /etc/roundup/cgiconf.py, adjust documentation for this (Closes: #193891) * oops, it was a native package. Adjusting the version. -- Bastian Kleineidam Mon, 19 May 2003 22:28:02 +0200 roundup (0.5.7-1) unstable; urgency=low * New upstream release. * add "but may be used by others" to man pages, it looks nicer :) * the DFSG-free copyright is now upstream, remove extra note from debian/copyright -- Bastian Kleineidam Sun, 11 May 2003 12:06:21 +0200 roundup (0.5.6-1) unstable; urgency=low * Initial Release (Closes: #68709). * The copyright is taken from CVS to make it DFSG free -- Bastian Kleineidam Thu, 16 Jan 2003 19:39:45 +0100 debian/roundup.preinst0000644000000000000000000000162712045441005012271 0ustar #!/bin/sh -e # thanks to the nut maintainer(s) # source the debconf library #. /usr/share/debconf/confmodule check_and_create_group() { if [ ! "`getent group roundup`" ]; then groupadd -r roundup fi } check_and_create_user() { if [ ! "`getent passwd roundup`" ]; then useradd -r -g roundup -d /var/lib/roundup roundup fi groupmod -g `id -u roundup` roundup 2>/dev/null || true usermod -g `getent group roundup | sed -e 's/^.*x//' -e 's/://g'` roundup 2>/dev/null || true } case "$1" in install) # Check for existing roundup system account, and create it if needed check_and_create_group check_and_create_user ;; upgrade) # Check for existing roundup system account, and create it if needed check_and_create_group check_and_create_user ;; abort-upgrade) # do nothing ;; *) echo "$0: incorrect arguments: $*" >&2 exit 1 ;; esac #DEBHELPER# debian/roundup.install0000644000000000000000000000016112045441005012243 0ustar debian/service /etc/roundup debian/roundup-ctl /usr/bin debian/roundup-server.ini debian/cgiconf.py /etc/roundup debian/roundup-dirs.init0000755000000000000000000000171712045441005012512 0ustar #!/bin/sh -e # # roundup-dirs Create runit dirs for the roundup http server. # # Version: $Id$ # ### BEGIN INIT INFO # Provides: roundup-dirs # Required-Start: $local_fs $remote_fs # Required-Stop: $remote_fs # Should-Start: # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Create 'runit' dirs for the roundup HTTP server # Description: Start the stand-alone roundup HTTP server ### END INIT INFO DESC='Runit dirs for the Roundup HTTP-Server' BINFILE=roundup-server EXECUTABLE=/usr/bin/$BINFILE RUNIT=/usr/bin/runsv test -x $EXECUTABLE && test -x $RUNIT || exit 0 start_stop() { case "$1" in start) printf "$DESC:" install -o root -g root -m 755 -d /var/run/roundup install -o root -g root -m 755 -d /var/run/roundup.log ;; stop) ;; restart|force-reload) start_stop stop sleep 1 start_stop start ;; *) printf "Usage: $0 {start|stop|restart}\n" >&2 exit 1 ;; esac } exit 0 debian/roundup.links0000644000000000000000000000036012045441005011716 0ustar /var/run/roundup /etc/roundup/service/supervise /var/run/roundup.log /etc/roundup/service/log/supervise /var/log/roundup /etc/roundup/service/log/main /usr/share/javascript/jquery/jquery.js /usr/share/roundup/templates/devel/html/jquery.js debian/roundup.postrm0000644000000000000000000000222412045441005012123 0ustar #!/bin/sh -e U=roundup check_and_delete_user() { if [ `getent passwd $U` ]; then userdel $U >/dev/null 2>&1 fi } check_and_delete_group() { if [ X"`getent group $U`" != X ]; then groupdel $U >/dev/null 2>&1 || true fi } case "$1" in purge) rm -f /etc/init.d/roundup /etc/init.d/roundup-dirs update-rc.d roundup remove >/dev/null update-rc.d roundup-dirs remove > /dev/null # handle a dpkg bug [ -d /etc/roundup ] && rmdir --ignore-fail-on-non-empty /etc/roundup >/dev/null 2>&1 [ -d /var/lib/roundup/trackers ] && rmdir --ignore-fail-on-non-empty /var/lib/roundup/trackers >/dev/null 2>&1 [ -d /var/lib/roundup ] && rmdir --ignore-fail-on-non-empty /var/lib/roundup >/dev/null 2>&1 rm -f /var/service/roundup > /dev/null 2>&1 rm -fr /etc/roundup/service > /dev/null 2>&1 rm -fr /var/run/roundup > /dev/null 2>&1 check_and_delete_user check_and_delete_group ;; remove|abort-install|disappear) # do nothing ;; upgrade) # do nothing ;; failed-upgrade) # do nothing ;; abort-upgrade) # do nothing ;; *) echo "$0: incorrect arguments: $*" >&2 exit 1 ;; esac debian/roundup-gettext.10000644000000000000000000000124412045441005012422 0ustar .TH ROUNDUP-GETTEXT 1 "9 February 2005" .SH NAME roundup-gettext - extract translatable strings from tracker templates .SH SYNOPSIS \fBroundup-gettext\fP [\fIoptions\fP] \fItracker_home\fP .SH OPTIONS .TP \fB-h\fP, \fB--help\fP Print usage and exit. .SH DESCRIPTION All *.html files in the given \fItracker_home\fP directory will be scanned for translatable string. The result will be written in a file named \fItracker_home\fP\fB/locale/messages.pot\fP in the current directory. .SH AUTHOR This manpage was written by Bastian Kleineidam for the Debian distribution of roundup. The main author of roundup is Richard Jones . debian/roundup.postinst0000644000000000000000000000177412045441005012473 0ustar #!/bin/sh set -e if [ -d /var/service ]; then if [ -e /etc/default/roundup ]; then . /etc/default/roundup fi if [ $USERUNIT -eq 0 ]; then touch /etc/roundup/service/down fi x=`dpkg-query -W -f '${Status}' runit 2>/dev/null` || true if [ "X$x" != X ]; then # runit is installed, now check the version: y=`dpkg-query -W -f '${Version}' runit` dpkg --compare-versions "$y" ge '1.8.0-2' if [ $? -eq 1 ]; then # have an old version of 'runit': if [ ! -e /var/service/roundup ]; then ln -s /etc/roundup/service /var/service/roundup fi else update-service --add /etc/roundup/service roundup fi fi fi if [ -x "/etc/init.d/roundup" ]; then update-rc.d roundup defaults >/dev/null update-rc.d roundup-dirs defaults 19 99 > /dev/null if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then invoke-rc.d roundup-dirs restart || exit $? invoke-rc.d roundup restart || exit $? else /etc/init.d/roundup-dirs restart || exit $? /etc/init.d/roundup restart || exit $? fi fi debian/cgiconf.py0000644000000000000000000000246012045441005011145 0ustar # ## Configuration for /usr/lib/cgi-bin/roundup.cgi # # Configuration can also be provided through the OS environment (or via # the Apache "SetEnv" configuration directive). If the variables # documented below are set, they _override_ any configuation defaults # given in this file. # TRACKER_HOMES is a list of trackers, in the form # "NAME=DIRNAME2=DIR2...", where is the directory path # separator (";" on Windows, ":" on Unix). # Make sure the NAME part doesn't include any url-unsafe characters like # spaces, as these confuse the cookie handling in browsers like IE. # ROUNDUP_LOG is the name of the logfile; if it's empty or does not exist, # logging is turned off (unless you changed the default below). # ROUNDUP_DEBUG is a debug level, currently only 0 (OFF) and 1 (ON) are # used in the code. Higher numbers means more debugging output. # This indicates where the Roundup tracker lives TRACKER_HOMES = { # you can add entries like # 'demo': '/home/joe/roundup/trackers/demo', #'mytracker': '/var/lib/roundup/trackers/mytracker', } # Where to log debugging information to. Use an instance of DevNull if you # don't want to log anywhere. class DevNull: def write(self, info): pass def close(self): pass #LOG = open('/var/log/roundup.cgi.log', 'a') LOG = DevNull() debian/roundup.manpages0000644000000000000000000000011512045441005012367 0ustar debian/roundup-ctl.1 debian/roundup-gettext.1 debian/roundup-xmlrpc-server.1 debian/README.Debian0000644000000000000000000002102712045441005011224 0ustar ================== roundup for Debian ================== For upgrading your roundup data and templates from older roundup versions, see /usr/share/doc/roundup/doc/upgrading.txt.gz. The following documentation is adjusted to the Debian roundup directory layout. More information on tracker installation can be found at /usr/share/doc/roundup/doc/installation.txt.gz. NOTE from your package maintainer: Installing as a CGI is not supported by the Debian package. If you really need that, you have to copy your files around manually. Please note that roundup's performance as a CGI sucks - better reverse-proxy to a stand-alone server, if you're after SSL and these options. Caution: If you want to run roundup under the control of runit, please link it into the service directory as 'roundup'. Otherwise, automatic upgrades might fail. The package makes some use of the jQuery library in the `devel' template. To get this functionality, you need to install the libjs-jquery package. 0. Backend selection ==================== Note that when selecting back ends one has to consider the desired performance. The `anydbm` module is the slowest and should only be used for small demo trackers. The best back ends with regard to performance, scaling up to several thousand issues in the tracker DB, are the big database packages PostgreSQL (installed with python-psycopg, backend `postgresql`) and MySQL (installed with python-mysqldb, backend `mysql`). The actual backend is selected by the contents of the file `db/backend_name`, assuming default paths and the setting of 'database = db' in `config.ini`'s '[main]' section. For PostgreSQL, the contents of this file would be `postgresql`. 1. System-wide tracker installation =================================== a) Installation ------------ The default system-wide tracker directory is /var/lib/roundup/trackers/. To install a new tracker `mytracker', issue as root: # roundup-admin install Enter tracker home: /var/lib/roundup/trackers/mytracker Templates: classic Select template [classic]: classic Back ends: anydbm, mysql, postgresql, metakit, sqlite Select backend [anydbm]: anydbm Then, edit /var/lib/roundup/trackers/mytracker/config.ini and adjust the values. IMPORTANT: Don't forget to initialise the tracker database with: # roundup-admin initialise IMPORTANT: Don't forget to chown the database directory (usually 'db' in the tracker's home) to the roundup user, as roundup will otherwise not be able to write to the database, and hence bail out: # chown -R roundup /var/lib/roundup/trackers/your-tracker-home b) I. Web gateway as standalone http server ---------------------------------------- Edit /var/lib/roundup/trackers/mytracker/config.ini and set TRACKER_WEB to "http://localhost:8088/mytracker/". Since the server won't run as root, you must use a different user, eg. "www-data" (the Debian standard web server's user id), or "roundup", the user that this package creates for use by the roundup server. There are two major ways to run roundup, one as a service under 'runit', the other as a standard daemon from an init.d script. The following examples are geared towards using the default user, roundup: # chown -R roundup:roundup /var/lib/roundup/trackers/mytracker Then run (as a first test): # su roundup -c 'roundup-server -p 8088 mytracker=/var/lib/roundup/trackers/mytracker' To use the roundup server together with `runit`, install the `runit` package and edit the file `/etc/roundup/service/run`. After that, add a symbolic link to enable the roundup server: # ln -s /etc/roundup/service /var/service/roundup The roundup server should start within 5 seconds, logging to `/var/log/roundup/current`. You can control the server with the `sv` command from the `runit` package, or the init script. An alternative way to daemonize the roundup-server is given using start-stop-daemon(8). See the example script located at `/usr/share/doc/roundup/examples/roundup.rc-debian`. You have the option of running the roundup server in standalone mode, or monitored under the `runit` package. To choose either option, you can edit the value of the `USERUNIT` variable in `/etc/default/roundup`. The default is to not use runit. The init script can still be used and will issue runit commands to the same effect as if running stand-alone. II. Web gateway as CGI script ----------------------------- Note that this solution is somewhat slower then the standalone http server since every request is starting up a Python instance. Add the tracker to TRACKER_HOMES variable in /etc/roundup/cgiconf.py: TRACKER_HOMES = { 'mytracker': '/var/lib/roundup/trackers/mytracker', } Or you can set an environment variable with Apache mod_env: SetEnv TRACKER_HOMES mytracker=/var/lib/roundup/trackers/mytracker IMPORTANT: under most web server configurations, cgi scripts are executed under a certain user. This user must have write access to the database directory and all files in it. All other tracker files must at least be readable by this user. For example apache runs roundup.cgi under user and group www-data, so you have to adjust the files like this: # chown -R www-data:www-data /var/lib/roundup/trackers/mytracker III. Web gateway with mod_python -------------------------------- Using mod_python is much faster than a CGI script which loads a Python interpreter for every request. First install the Debian package `libapache2-mod-python` and enable the mod_python module. Then adjust the example apache config file located under /usr/share/doc/roundup/examples/roundup_apache and copy it into "/etc/apache2/conf.d/roundup". After reloading apache the tracker instance will be accessible under the URL "http://localhost/roundup/mytracker/". c) Email gateway Define an email alias mytracker@localhost as a pipe to: |/usr/bin/roundup-mailgw /var/lib/roundup/trackers/mytracker If you are an Exim4 user, please refer to the upstream documentation file "installation.txt" and to the file /usr/share/doc/exim4/README.* files as well. 2. Private per-user tracker installation ======================================== a) Installation Each user can have their own trackers. Just replace the above pathnames with custom ones, for example /home/user/mytracker (in the following also referenced with $HOME/mytracker). b) I. Web gateway as standalone http server ---------------------------------------- Edit $HOME/mytracker/config.ini and set TRACKER_WEB to "http://localhost:8088/mytracker/". Then run (as a first test): $ roundup-server -p 8088 mytracker=/home/user/mytracker To install the roundup server properly, install the `runit` package and make a runsvdir directory: $ mkdir $HOME/service Then copy (with options -rL) the roundup service files into it: $ cp -rL /etc/roundup/service $HOME/service/roundup Edit the file `$HOME/service/roundup/run` to suit your needs. After that start the runit control program: $ runsvdir $HOME/service & The roundup server should start within 5 seconds, logging to `$HOME/service/roundup/log/main/current`. You can control the server with the `roundup-ctl` script, for example: $ roundup-ctl -d $HOME/service/roundup down To stop the runsvdir process cleanly send it a HUP signal with the kill(1) command. II. Web gateway as CGI script ----------------------------- You can also use the system-wide installed web server, but remember as above that the roundup.cgi script is executed as a certain user and group which must have write access to the database. Copy /usr/share/doc/roundup/examples/roundup.cgi to your local cgi directory (usually $HOME/public_html/cgi-lib/) and make sure it is executable. Add the tracker home: TRACKER_HOMES = { 'mytracker': '/home/user/mytracker', } c) Mail gateway With qmail, a user can set up a mail gateway with: $ chmod +t $HOME $ echo "|/usr/bin/roundup-mailgw $HOME/mytracker" > \ $HOME/.qmail-mytracker $ chmod -t $HOME 3. Long running roundup-server instances ======================================== Note that long running Python processes may deplete your system memory since the current [1]C Python implementation never free()s allocated memory. [1] http://evanjones.ca/python-memory.html For more information, including installing the Zope frontend (ZRoundup), read /usr/share/doc/roundup/doc/installation.txt.gz. debian/roundup-ctl0000644000000000000000000000076712045441005011372 0ustar #!/bin/sh -e PATH=/sbin:/bin:/usr/sbin:/usr/bin NAME=roundup DESC="roundup server" if [ "x$1" = "x-d" ]; then shift SERVICE="$1" shift else SERVICE=/var/service/$NAME fi if [ -d "$SERVICE" ]; then case "$1" in start|stop|reload|force-reload|restart|status) sv -v "$1" ${NAME} ;; *) echo "Usage: roundup-ctl {start|stop|restart|reload|force-reload|status}" >&2 exit 3 ;; esac else echo "roundup-ctl: $SERVICE is not a directory" exit 1 fi exit 0 debian/roundup.dirs0000644000000000000000000000011312045441005011533 0ustar var/lib/roundup/trackers var/log/roundup etc/roundup usr/share/doc/roundup debian/rules0000755000000000000000000000140512045441005010241 0ustar #!/usr/bin/make -f # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 export DH_OPTIONS=-v PACKAGE=roundup UPSTREAM_VERSION=1.4.20 DEB_SRCDIR=$(CURDIR) ROOT=$(DEB_SRCDIR)/debian/$(PACKAGE) DEB_BUILDDIR=debian/$(PACKAGE) DOC=$(DEB_SRCDIR)/debian/$(PACKAGE)/usr/share/doc/$(PACKAGE) %: dh --with python2 $@ # The runit files have executables: override_dh_install: dh_install chmod -R 0755 $(ROOT)/etc/roundup/service # We have 2 initscripts instead of one override_dh_installinit: dh_installinit # dh_installinit doesn't support renaming; use install: install -m 755 -o root -g bin debian/roundup-dirs.init $(ROOT)/etc/init.d/roundup-dirs # somehow dh --builddirectory doesn't work for the builddir itself. override_dh_clean: dh_clean rm -rf build debian/roundup.docs0000644000000000000000000000002112045441005011520 0ustar README.txt doc/* debian/roundup_apache0000644000000000000000000000240512045441005012102 0ustar ################################################# # Roundup Issue tracker ################################################# # enable Python optimizations (like 'python -O') PythonOptimize On # let apache handle static files from 'html' directories AliasMatch ^/roundup/([^/]+)/@@file/(.*) /var/lib/roundup/trackers/$1/html/$2 # everything else is handled by roundup web UI AliasMatch ^/roundup/([^/]+)/(?!@@file/)(.*) /var/lib/roundup/trackers/$1/dummy.py/$2 # roundup requires a slash after tracker name - add it if missing RedirectMatch permanent ^/roundup/([^/]+)$ /roundup/$1/ # common settings for all roundup trackers Order allow,deny Allow from all AllowOverride None Options None AddHandler python-program .py PythonHandler roundup.cgi.apache # uncomment the following line to see tracebacks in the browser # (note that *some* tracebacks will be displayed anyway) #PythonDebug On # roundup tracker homes PythonOption TrackerHome /var/lib/roundup/trackers/support PythonOption TrackerLanguage en debian/source/0000755000000000000000000000000012045441005010461 5ustar debian/source/lintian-overrides0000644000000000000000000000050012045441005014035 0ustar # This is intentional. Our postinst and postrm scripts manage both # /etc/init.d/roundup and /etc/init.d/roundup-dirs. No need for debhelper to # be too helpful. roundup source: maintainer-script-lacks-debhelper-token debian/roundup.postinst roundup source: maintainer-script-lacks-debhelper-token debian/roundup.postrm debian/source/format0000644000000000000000000000001412045441005011667 0ustar 3.0 (quilt) debian/compat0000644000000000000000000000000212045441005010357 0ustar 7 debian/roundup.examples0000644000000000000000000000005212045441005012412 0ustar scripts/ detectors/ debian/roundup_apache debian/patches/0000755000000000000000000000000012045441005010610 5ustar debian/patches/series0000644000000000000000000000034312045441005012025 0ustar 00_licensefiles.patch 01_separate_configuration.patch 05_roundup_server_umask.patch 08_update_manpages.patch 09_german_translation.patch 11_add-old-detector-sampes.patch no-integrated-jquery.patch 12_manpage_hyphen_minus.patch debian/patches/09_german_translation.patch0000644000000000000000000000333312045441005016032 0ustar Author: Description: Updated translation --- a/locale/de.po +++ b/locale/de.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Roundup 1.4.6\n" +"Project-Id-Version: Roundup 1.4.15\n" "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2009-03-12 11:58+0200\n" -"PO-Revision-Date: 2009-03-12 18:05+0200\n" +"PO-Revision-Date: 2010-08-07 17:25+0200\n" "Last-Translator: Tobias Herp \n" "Language-Team: German Translators \n" "MIME-Version: 1.0\n" @@ -261,7 +261,7 @@ "Verwendung: help Thema\n" " Zeigt die Hilfe für ein Thema ein.\n" "\n" -" commands -- Befehle auflisten\n" +" commands -- Befehlsliste ausgeben\n" " -- Hilfe zu einem bestimmten Befehl\n" " initopts -- Optionen zur Initialisierung\n" " all -- sämtlichen Hilfetext anzeigen\n" @@ -385,7 +385,7 @@ #: ../roundup/admin.py:401 msgid "Select template [classic]: " -msgstr "Template auswählen [classic]:" +msgstr "Vorlagensatz auswählen [classic]:" #: ../roundup/admin.py:412 msgid "Select backend [anydbm]: " @@ -446,7 +446,7 @@ msgstr "" "Verwendung: genconfig \n" " Schreibt eine neue Tracker-Konfiguration (im \".ini\"-Format) mit \n" -" Standard-Werten in die Datei .\n" +" Standardwerten in die Datei .\n" " " #. password @@ -1900,7 +1900,7 @@ "\tcontains old-style template - ignored" msgstr "" "WARNUNG: Das Verzeichnis '%s'\n" -"\tenthält Templates im alten Format, die ignoriert werden." +"\tenthält Vorlagen im alten Format, die ignoriert werden." #: ../roundup/mailgw.py:201 #: ../roundup/mailgw.py:213 debian/patches/12_manpage_hyphen_minus.patch0000644000000000000000000000341612045441005016335 0ustar fix hyphens to minusses (and its lintian warning) --- a/share/man/man1/roundup-admin.1 +++ b/share/man/man1/roundup-admin.1 @@ -22,7 +22,7 @@ When outputting lists of data, space-separate them. Same as \fB-S " "\fP. .SH FURTHER HELP - roundup-admin -h + roundup-admin \-h roundup-admin help -- this help roundup-admin help -- command-specific help roundup-admin help all -- all available help --- a/share/man/man1/roundup-mailgw.1 +++ b/share/man/man1/roundup-mailgw.1 @@ -10,10 +10,10 @@ .TP \fB-C\fP \fIhyperdb class\fP specify a tracker class - one of msg (the default), issue, file, user - to -manipulate with -S options +manipulate with \-S options .TP \fB-S\fP \fIproperty\fP\fB=\fP\fIvalue\fP[\fB;\fP\fIproperty\fP\fB=\fP\fIvalue\fP] \fIpairs\fP -specify the values to set on the class specified by -C using the same +specify the values to set on the class specified by \-C using the same format as the Subject line property manipulations .SH DESCRIPTION The roundup mail gateway may be called in one of three ways: --- a/share/man/man1/roundup-server.1 +++ b/share/man/man1/roundup-server.1 @@ -18,7 +18,7 @@ Daemonize, and write the server's PID to the nominated file. .TP \fB-l\fP \fIfile\fP -Sets a filename to log to (instead of stdout). This is required if the -d +Sets a filename to log to (instead of stdout). This is required if the \-d option is used. .TP \fB-i\fP \fIfile\fP @@ -44,8 +44,8 @@ .TP \fB-d\fP \fIPIDfile\fP Run the server in the background and write the server's PID -to the file indicated by PIDfile. The -l option \fBmust\fP be -specified if -d is used. +to the file indicated by PIDfile. The \-l option \fBmust\fP be +specified if \-d is used. .TP \fB-v\fP Print version and exit. debian/patches/11_add-old-detector-sampes.patch0000644000000000000000000000766112045441005016545 0ustar Author: Description: Added back the old detector examples script --- /dev/null +++ b/detectors/creator_resolution.py @@ -0,0 +1,43 @@ +# This detector was written by richard@mechanicalcat.net and it's been +# placed in the Public Domain. Copy and modify to your heart's content. + +#$Id: creator_resolution.py,v 1.2 2004-04-07 06:32:54 richard Exp $ + +from roundup.exceptions import Reject + +def creator_resolution(db, cl, nodeid, newvalues): + '''Catch attempts to set the status to "resolved" - if the assignedto + user isn't the creator, then set the status to "in-progress" (try + "confirm-done" first though, but "classic" Roundup doesn't have that + status) + ''' + if not newvalues.has_key('status'): + return + + # get the resolved state ID + resolved_id = db.status.lookup('resolved') + + if newvalues['status'] != resolved_id: + return + + # check the assignedto + assignedto = newvalues.get('assignedto', cl.get(nodeid, 'assignedto')) + creator = cl.get(nodeid, 'creator') + if assignedto == creator: + if db.getuid() != creator: + name = db.user.get(creator, 'username') + raise Reject, 'Only the creator (%s) may close this issue'%name + return + + # set the assignedto and status + newvalues['assignedto'] = creator + try: + status = db.status.lookup('confirm-done') + except KeyError: + status = db.status.lookup('in-progress') + newvalues['status'] = status + +def init(db): + db.issue.audit('set', creator_resolution) + +# vim: set filetype=python ts=4 sw=4 et si --- /dev/null +++ b/detectors/emailauditor.py @@ -0,0 +1,42 @@ + +def eml_to_mht(db, cl, nodeid, newvalues): + '''This auditor fires whenever a new file entity is created. + + If the file is of type message/rfc822, we tack onthe extension .eml. + + The reason for this is that Microsoft Internet Explorer will not open + things with a .eml attachment, as they deem it 'unsafe'. Worse yet, + they'll just give you an incomprehensible error message. For more + information, please see: + + http://support.microsoft.com/default.aspx?scid=kb;EN-US;825803 + + Their suggested work around is (excerpt): + + WORKAROUND + + To work around this behavior, rename the .EML file that the URL + links to so that it has a .MHT file name extension, and then update + the URL to reflect the change to the file name. To do this: + + 1. In Windows Explorer, locate and then select the .EML file that + the URL links. + 2. Right-click the .EML file, and then click Rename. + 3. Change the file name so that the .EML file uses a .MHT file name + extension, and then press ENTER. + 4. Updated the URL that links to the file to reflect the new file + name extension. + + So... we do that. :)''' + if newvalues.get('type', '').lower() == "message/rfc822": + if not newvalues.has_key('name'): + newvalues['name'] = 'email.mht' + return + name = newvalues['name'] + if name.endswith('.eml'): + name = name[:-4] + newvalues['name'] = name + '.mht' + +def init(db): + db.file.audit('create', eml_to_mht) + --- /dev/null +++ b/detectors/newissuecopy.py @@ -0,0 +1,22 @@ +# copied from nosyreaction + +from roundup import roundupdb + +def newissuecopy(db, cl, nodeid, oldvalues): + ''' Copy a message about new issues to a team address. + ''' + # so use all the messages in the create + change_note = cl.generateCreateNote(nodeid) + + # send a copy to the nosy list + for msgid in cl.get(nodeid, 'messages'): + try: + # note: last arg must be a list + cl.send_message(nodeid, msgid, change_note, ['team@team.host']) + except roundupdb.MessageSendError, message: + raise roundupdb.DetectorError, message + +def init(db): + db.issue.react('create', newissuecopy) + +# vim: set filetype=python ts=4 sw=4 et si debian/patches/no-integrated-jquery.patch0000644000000000000000000036454312045441005015725 0ustar Packaging jquery with the roundup policy is against policy. --- a/share/roundup/templates/devel/html/jquery.js +++ /dev/null @@ -1,4376 +0,0 @@ -/*! - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){ - -var - // Will speed up references to window, and allows munging its name. - window = this, - // Will speed up references to undefined, and allows munging its name. - undefined, - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - // Map over the $ in case of overwrite - _$ = window.$, - - jQuery = window.jQuery = window.$ = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context ); - }, - - // A simple way to check for HTML strings or ID strings - // (both of which we optimize for) - quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, - // Is it a simple selector - isSimple = /^.[^:#\[\.,]*$/; - -jQuery.fn = jQuery.prototype = { - init: function( selector, context ) { - // Make sure that a selection was provided - selector = selector || document; - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this[0] = selector; - this.length = 1; - this.context = selector; - return this; - } - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - var match = quickExpr.exec( selector ); - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) - selector = jQuery.clean( [ match[1] ], context ); - - // HANDLE: $("#id") - else { - var elem = document.getElementById( match[3] ); - - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem && elem.id != match[3] ) - return jQuery().find( selector ); - - // Otherwise, we inject the element directly into the jQuery object - var ret = jQuery( elem || [] ); - ret.context = document; - ret.selector = selector; - return ret; - } - - // HANDLE: $(expr, [context]) - // (which is just equivalent to: $(content).find(expr) - } else - return jQuery( context ).find( selector ); - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) - return jQuery( document ).ready( selector ); - - // Make sure that old selector state is passed along - if ( selector.selector && selector.context ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return this.setArray(jQuery.isArray( selector ) ? - selector : - jQuery.makeArray(selector)); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.3.2", - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num === undefined ? - - // Return a 'clean' array - Array.prototype.slice.call( this ) : - - // Return just the object - this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = jQuery( elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) - ret.selector = this.selector + (this.selector ? " " : "") + selector; - else if ( name ) - ret.selector = this.selector + "." + name + "(" + selector + ")"; - - // Return the newly-formed element set - return ret; - }, - - // Force the current matched set of elements to become - // the specified array of elements (destroying the stack in the process) - // You should use pushStack() in order to do this, but maintain the stack - setArray: function( elems ) { - // Resetting the length to 0, then using the native Array push - // is a super-fast way to populate an object with array-like properties - this.length = 0; - Array.prototype.push.apply( this, elems ); - - return this; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem && elem.jquery ? elem[0] : elem - , this ); - }, - - attr: function( name, value, type ) { - var options = name; - - // Look for the case where we're accessing a style value - if ( typeof name === "string" ) - if ( value === undefined ) - return this[0] && jQuery[ type || "attr" ]( this[0], name ); - - else { - options = {}; - options[ name ] = value; - } - - // Check to see if we're setting style values - return this.each(function(i){ - // Set all the styles - for ( name in options ) - jQuery.attr( - type ? - this.style : - this, - name, jQuery.prop( this, options[ name ], type, i, name ) - ); - }); - }, - - css: function( key, value ) { - // ignore negative width and height values - if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) - value = undefined; - return this.attr( key, value, "curCSS" ); - }, - - text: function( text ) { - if ( typeof text !== "object" && text != null ) - return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); - - var ret = ""; - - jQuery.each( text || this, function(){ - jQuery.each( this.childNodes, function(){ - if ( this.nodeType != 8 ) - ret += this.nodeType != 1 ? - this.nodeValue : - jQuery.fn.text( [ this ] ); - }); - }); - - return ret; - }, - - wrapAll: function( html ) { - if ( this[0] ) { - // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).clone(); - - if ( this[0].parentNode ) - wrap.insertBefore( this[0] ); - - wrap.map(function(){ - var elem = this; - - while ( elem.firstChild ) - elem = elem.firstChild; - - return elem; - }).append(this); - } - - return this; - }, - - wrapInner: function( html ) { - return this.each(function(){ - jQuery( this ).contents().wrapAll( html ); - }); - }, - - wrap: function( html ) { - return this.each(function(){ - jQuery( this ).wrapAll( html ); - }); - }, - - append: function() { - return this.domManip(arguments, true, function(elem){ - if (this.nodeType == 1) - this.appendChild( elem ); - }); - }, - - prepend: function() { - return this.domManip(arguments, true, function(elem){ - if (this.nodeType == 1) - this.insertBefore( elem, this.firstChild ); - }); - }, - - before: function() { - return this.domManip(arguments, false, function(elem){ - this.parentNode.insertBefore( elem, this ); - }); - }, - - after: function() { - return this.domManip(arguments, false, function(elem){ - this.parentNode.insertBefore( elem, this.nextSibling ); - }); - }, - - end: function() { - return this.prevObject || jQuery( [] ); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: [].push, - sort: [].sort, - splice: [].splice, - - find: function( selector ) { - if ( this.length === 1 ) { - var ret = this.pushStack( [], "find", selector ); - ret.length = 0; - jQuery.find( selector, this[0], ret ); - return ret; - } else { - return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ - return jQuery.find( selector, elem ); - })), "find", selector ); - } - }, - - clone: function( events ) { - // Do the clone - var ret = this.map(function(){ - if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { - // IE copies events bound via attachEvent when - // using cloneNode. Calling detachEvent on the - // clone will also remove the events from the orignal - // In order to get around this, we use innerHTML. - // Unfortunately, this means some modifications to - // attributes in IE that are actually only stored - // as properties will not be copied (such as the - // the name attribute on an input). - var html = this.outerHTML; - if ( !html ) { - var div = this.ownerDocument.createElement("div"); - div.appendChild( this.cloneNode(true) ); - html = div.innerHTML; - } - - return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; - } else - return this.cloneNode(true); - }); - - // Copy the events from the original to the clone - if ( events === true ) { - var orig = this.find("*").andSelf(), i = 0; - - ret.find("*").andSelf().each(function(){ - if ( this.nodeName !== orig[i].nodeName ) - return; - - var events = jQuery.data( orig[i], "events" ); - - for ( var type in events ) { - for ( var handler in events[ type ] ) { - jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); - } - } - - i++; - }); - } - - // Return the cloned set - return ret; - }, - - filter: function( selector ) { - return this.pushStack( - jQuery.isFunction( selector ) && - jQuery.grep(this, function(elem, i){ - return selector.call( elem, i ); - }) || - - jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ - return elem.nodeType === 1; - }) ), "filter", selector ); - }, - - closest: function( selector ) { - var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, - closer = 0; - - return this.map(function(){ - var cur = this; - while ( cur && cur.ownerDocument ) { - if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { - jQuery.data(cur, "closest", closer); - return cur; - } - cur = cur.parentNode; - closer++; - } - }); - }, - - not: function( selector ) { - if ( typeof selector === "string" ) - // test special case where just one selector is passed in - if ( isSimple.test( selector ) ) - return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); - else - selector = jQuery.multiFilter( selector, this ); - - var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; - return this.filter(function() { - return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; - }); - }, - - add: function( selector ) { - return this.pushStack( jQuery.unique( jQuery.merge( - this.get(), - typeof selector === "string" ? - jQuery( selector ) : - jQuery.makeArray( selector ) - ))); - }, - - is: function( selector ) { - return !!selector && jQuery.multiFilter( selector, this ).length > 0; - }, - - hasClass: function( selector ) { - return !!selector && this.is( "." + selector ); - }, - - val: function( value ) { - if ( value === undefined ) { - var elem = this[0]; - - if ( elem ) { - if( jQuery.nodeName( elem, 'option' ) ) - return (elem.attributes.value || {}).specified ? elem.value : elem.text; - - // We need to handle select boxes special - if ( jQuery.nodeName( elem, "select" ) ) { - var index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type == "select-one"; - - // Nothing was selected - if ( index < 0 ) - return null; - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - if ( option.selected ) { - // Get the specifc value for the option - value = jQuery(option).val(); - - // We don't need an array for one selects - if ( one ) - return value; - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - } - - // Everything else, we just grab the value - return (elem.value || "").replace(/\r/g, ""); - - } - - return undefined; - } - - if ( typeof value === "number" ) - value += ''; - - return this.each(function(){ - if ( this.nodeType != 1 ) - return; - - if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) - this.checked = (jQuery.inArray(this.value, value) >= 0 || - jQuery.inArray(this.name, value) >= 0); - - else if ( jQuery.nodeName( this, "select" ) ) { - var values = jQuery.makeArray(value); - - jQuery( "option", this ).each(function(){ - this.selected = (jQuery.inArray( this.value, values ) >= 0 || - jQuery.inArray( this.text, values ) >= 0); - }); - - if ( !values.length ) - this.selectedIndex = -1; - - } else - this.value = value; - }); - }, - - html: function( value ) { - return value === undefined ? - (this[0] ? - this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : - null) : - this.empty().append( value ); - }, - - replaceWith: function( value ) { - return this.after( value ).remove(); - }, - - eq: function( i ) { - return this.slice( i, +i + 1 ); - }, - - slice: function() { - return this.pushStack( Array.prototype.slice.apply( this, arguments ), - "slice", Array.prototype.slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function(elem, i){ - return callback.call( elem, i, elem ); - })); - }, - - andSelf: function() { - return this.add( this.prevObject ); - }, - - domManip: function( args, table, callback ) { - if ( this[0] ) { - var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), - scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), - first = fragment.firstChild; - - if ( first ) - for ( var i = 0, l = this.length; i < l; i++ ) - callback.call( root(this[i], first), this.length > 1 || i > 0 ? - fragment.cloneNode(true) : fragment ); - - if ( scripts ) - jQuery.each( scripts, evalScript ); - } - - return this; - - function root( elem, cur ) { - return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? - (elem.getElementsByTagName("tbody")[0] || - elem.appendChild(elem.ownerDocument.createElement("tbody"))) : - elem; - } - } -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -function evalScript( i, elem ) { - if ( elem.src ) - jQuery.ajax({ - url: elem.src, - async: false, - dataType: "script" - }); - - else - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); - - if ( elem.parentNode ) - elem.parentNode.removeChild( elem ); -} - -function now(){ - return +new Date; -} - -jQuery.extend = jQuery.fn.extend = function() { - // copy reference to target object - var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) - target = {}; - - // extend jQuery itself if only one argument is passed - if ( length == i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) - // Extend the base object - for ( var name in options ) { - var src = target[ name ], copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) - continue; - - // Recurse if we're merging object values - if ( deep && copy && typeof copy === "object" && !copy.nodeType ) - target[ name ] = jQuery.extend( deep, - // Never move original objects, clone them - src || ( copy.length != null ? [ ] : { } ) - , copy ); - - // Don't bring in undefined values - else if ( copy !== undefined ) - target[ name ] = copy; - - } - - // Return the modified object - return target; -}; - -// exclude the following css properties to add px -var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, - // cache defaultView - defaultView = document.defaultView || {}, - toString = Object.prototype.toString; - -jQuery.extend({ - noConflict: function( deep ) { - window.$ = _$; - - if ( deep ) - window.jQuery = _jQuery; - - return jQuery; - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return toString.call(obj) === "[object Function]"; - }, - - isArray: function( obj ) { - return toString.call(obj) === "[object Array]"; - }, - - // check if an element is in a (or is an) XML document - isXMLDoc: function( elem ) { - return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || - !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); - }, - - // Evalulates a script in a global context - globalEval: function( data ) { - if ( data && /\S/.test(data) ) { - // Inspired by code by Andrea Giammarchi - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.getElementsByTagName("head")[0] || document.documentElement, - script = document.createElement("script"); - - script.type = "text/javascript"; - if ( jQuery.support.scriptEval ) - script.appendChild( document.createTextNode( data ) ); - else - script.text = data; - - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709). - head.insertBefore( script, head.firstChild ); - head.removeChild( script ); - } - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, length = object.length; - - if ( args ) { - if ( length === undefined ) { - for ( name in object ) - if ( callback.apply( object[ name ], args ) === false ) - break; - } else - for ( ; i < length; ) - if ( callback.apply( object[ i++ ], args ) === false ) - break; - - // A special, fast, case for the most common use of each - } else { - if ( length === undefined ) { - for ( name in object ) - if ( callback.call( object[ name ], name, object[ name ] ) === false ) - break; - } else - for ( var value = object[0]; - i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} - } - - return object; - }, - - prop: function( elem, value, type, i, name ) { - // Handle executable functions - if ( jQuery.isFunction( value ) ) - value = value.call( elem, i ); - - // Handle passing in a number to a CSS property - return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? - value + "px" : - value; - }, - - className: { - // internal only, use addClass("class") - add: function( elem, classNames ) { - jQuery.each((classNames || "").split(/\s+/), function(i, className){ - if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) - elem.className += (elem.className ? " " : "") + className; - }); - }, - - // internal only, use removeClass("class") - remove: function( elem, classNames ) { - if (elem.nodeType == 1) - elem.className = classNames !== undefined ? - jQuery.grep(elem.className.split(/\s+/), function(className){ - return !jQuery.className.has( classNames, className ); - }).join(" ") : - ""; - }, - - // internal only, use hasClass("class") - has: function( elem, className ) { - return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; - } - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations - swap: function( elem, options, callback ) { - var old = {}; - // Remember the old values, and insert the new ones - for ( var name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - callback.call( elem ); - - // Revert the old values - for ( var name in options ) - elem.style[ name ] = old[ name ]; - }, - - css: function( elem, name, force, extra ) { - if ( name == "width" || name == "height" ) { - var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; - - function getWH() { - val = name == "width" ? elem.offsetWidth : elem.offsetHeight; - - if ( extra === "border" ) - return; - - jQuery.each( which, function() { - if ( !extra ) - val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; - if ( extra === "margin" ) - val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; - else - val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; - }); - } - - if ( elem.offsetWidth !== 0 ) - getWH(); - else - jQuery.swap( elem, props, getWH ); - - return Math.max(0, Math.round(val)); - } - - return jQuery.curCSS( elem, name, force ); - }, - - curCSS: function( elem, name, force ) { - var ret, style = elem.style; - - // We need to handle opacity special in IE - if ( name == "opacity" && !jQuery.support.opacity ) { - ret = jQuery.attr( style, "opacity" ); - - return ret == "" ? - "1" : - ret; - } - - // Make sure we're using the right name for getting the float value - if ( name.match( /float/i ) ) - name = styleFloat; - - if ( !force && style && style[ name ] ) - ret = style[ name ]; - - else if ( defaultView.getComputedStyle ) { - - // Only "float" is needed here - if ( name.match( /float/i ) ) - name = "float"; - - name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); - - var computedStyle = defaultView.getComputedStyle( elem, null ); - - if ( computedStyle ) - ret = computedStyle.getPropertyValue( name ); - - // We should always get a number back from opacity - if ( name == "opacity" && ret == "" ) - ret = "1"; - - } else if ( elem.currentStyle ) { - var camelCase = name.replace(/\-(\w)/g, function(all, letter){ - return letter.toUpperCase(); - }); - - ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { - // Remember the original values - var left = style.left, rsLeft = elem.runtimeStyle.left; - - // Put in the new values to get a computed value out - elem.runtimeStyle.left = elem.currentStyle.left; - style.left = ret || 0; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - elem.runtimeStyle.left = rsLeft; - } - } - - return ret; - }, - - clean: function( elems, context, fragment ) { - context = context || document; - - // !context.createElement fails in IE with an error but returns typeof 'object' - if ( typeof context.createElement === "undefined" ) - context = context.ownerDocument || context[0] && context[0].ownerDocument || document; - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { - var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); - if ( match ) - return [ context.createElement( match[1] ) ]; - } - - var ret = [], scripts = [], div = context.createElement("div"); - - jQuery.each(elems, function(i, elem){ - if ( typeof elem === "number" ) - elem += ''; - - if ( !elem ) - return; - - // Convert html string into DOM nodes - if ( typeof elem === "string" ) { - // Fix "XHTML"-style tags in all browsers - elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ - return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? - all : - front + ">"; - }); - - // Trim whitespace, otherwise indexOf won't work as expected - var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); - - var wrap = - // option or optgroup - !tags.indexOf("", "" ] || - - !tags.indexOf("", "" ] || - - tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && - [ 1, "", "
" ] || - - !tags.indexOf("", "" ] || - - // matched above - (!tags.indexOf("", "" ] || - - !tags.indexOf("", "" ] || - - // IE can't serialize and