diff options
47 files changed, 536 insertions, 204 deletions
@@ -1,7 +1,7 @@ Bugs Everywhere was written by: Aaron Bentley -Alexander Belchenko Alex Miller +Alexander Belchenko Ben Finney Chris Ball Gianluca Montecchi @@ -6,6 +6,7 @@ # # Copyright (C) 2008-2009 Ben Finney <benf@cybersource.com.au> # Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify @@ -15,25 +15,9 @@ Getting started To get started, you must set the bugtracker root. Typically, you will want to set the bug root to your project root, so that Bugs Everywhere works in any part of your project tree. -$ be init $PROJECT_ROOT +$ be init -r $PROJECT_ROOT To create bugs, use "be new $DESCRIPTION". To comment on bugs, you can can use "be comment $BUG_ID". To close a bug, use "be close $BUG_ID" or "be status $BUG_ID fixed". For more commands, see "be help". You can also look at the usage examples in test_usage.sh. - - -Using BeWeb, the web UI -======================= -BeWeb uses the Turbogears framework: http://www.turbogears.org/ -Please ensure you have Turbogears 0.8a5 or a compatible release installed. -Because it uses BE data, the web UI does not require a database. - -To use BeWeb, first create a configuration file, telling it which projects -to track, and what to call them. An example configuration file -(beweb/beweb/config.py.example) is provided. - -Next, cd to beweb, and run ./beweb-start.py - -BeWeb allows you to create, view and edit bugs, but it is in an early stage of -development, so some features are missing. @@ -1,6 +1,7 @@ #!/usr/bin/env python # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. # Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # Oleg Romanyshyn <oromanyshyn@panoramicfeedback.com> # W. Trevor King <wking@drexel.edu> # diff --git a/becommands/assign.py b/becommands/assign.py index 794f028..fbef281 100644 --- a/becommands/assign.py +++ b/becommands/assign.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # Marien Zwart <marienz@gentoo.org> # Thomas Gerigk <tgerigk@gmx.de> # W. Trevor King <wking@drexel.edu> diff --git a/becommands/close.py b/becommands/close.py index 0532ed2..2cdcb59 100644 --- a/becommands/close.py +++ b/becommands/close.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # Marien Zwart <marienz@gentoo.org> # Thomas Gerigk <tgerigk@gmx.de> # W. Trevor King <wking@drexel.edu> diff --git a/becommands/comment.py b/becommands/comment.py index 950a95a..dad32dd 100644 --- a/becommands/comment.py +++ b/becommands/comment.py @@ -1,5 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. -# Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/becommands/depend.py b/becommands/depend.py index f72b8ba..f52527e 100644 --- a/becommands/depend.py +++ b/becommands/depend.py @@ -1,4 +1,5 @@ -# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/becommands/diff.py b/becommands/diff.py index b6ac5b0..e71da9b 100644 --- a/becommands/diff.py +++ b/becommands/diff.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/becommands/help.py b/becommands/help.py index a8f346a..c12c56a 100644 --- a/becommands/help.py +++ b/becommands/help.py @@ -1,4 +1,5 @@ # Copyright (C) 2006-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # Thomas Gerigk <tgerigk@gmx.de> # W. Trevor King <wking@drexel.edu> # diff --git a/becommands/init.py b/becommands/init.py index a6098ba..275dd77 100644 --- a/becommands/init.py +++ b/becommands/init.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/becommands/list.py b/becommands/list.py index 12e1e29..14e387b 100644 --- a/becommands/list.py +++ b/becommands/list.py @@ -1,5 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. -# Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # Oleg Romanyshyn <oromanyshyn@panoramicfeedback.com> # W. Trevor King <wking@drexel.edu> # diff --git a/becommands/merge.py b/becommands/merge.py index f212b01..bc18479 100644 --- a/becommands/merge.py +++ b/becommands/merge.py @@ -1,4 +1,5 @@ -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/becommands/new.py b/becommands/new.py index a8ee2ec..30a7d28 100644 --- a/becommands/new.py +++ b/becommands/new.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/becommands/open.py b/becommands/open.py index 0c6bf05..c9e55a2 100644 --- a/becommands/open.py +++ b/becommands/open.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # Marien Zwart <marienz@gentoo.org> # Thomas Gerigk <tgerigk@gmx.de> # W. Trevor King <wking@drexel.edu> diff --git a/becommands/remove.py b/becommands/remove.py index 8d85033..0e61362 100644 --- a/becommands/remove.py +++ b/becommands/remove.py @@ -1,4 +1,5 @@ -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/becommands/set.py b/becommands/set.py index f7e68d3..e5cab8d 100644 --- a/becommands/set.py +++ b/becommands/set.py @@ -1,5 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. -# Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # Marien Zwart <marienz@gentoo.org> # Thomas Gerigk <tgerigk@gmx.de> # W. Trevor King <wking@drexel.edu> diff --git a/becommands/severity.py b/becommands/severity.py index 660586e..e987760 100644 --- a/becommands/severity.py +++ b/becommands/severity.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # Marien Zwart <marienz@gentoo.org> # Thomas Gerigk <tgerigk@gmx.de> # W. Trevor King <wking@drexel.edu> diff --git a/becommands/show.py b/becommands/show.py index 50bd6eb..94e16bf 100644 --- a/becommands/show.py +++ b/becommands/show.py @@ -1,5 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. -# Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # Thomas Gerigk <tgerigk@gmx.de> # Thomas Habets <thomas@habets.pp.se> # W. Trevor King <wking@drexel.edu> diff --git a/becommands/status.py b/becommands/status.py index f315003..827c7ce 100644 --- a/becommands/status.py +++ b/becommands/status.py @@ -1,4 +1,5 @@ -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/becommands/tag.py b/becommands/tag.py index ecd853f..31b43ba 100644 --- a/becommands/tag.py +++ b/becommands/tag.py @@ -1,4 +1,5 @@ -# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/doc/module.mk b/doc/module.mk index 7791f48..de33d6a 100644 --- a/doc/module.mk +++ b/doc/module.mk @@ -4,6 +4,7 @@ # Part of Bugs Everywhere, a distributed bug tracking system. # # Copyright (C) 2008-2009 Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/interfaces/web/Bugs-Everywhere-Web/README.txt b/interfaces/web/Bugs-Everywhere-Web/README index 10774df..c152757 100644 --- a/interfaces/web/Bugs-Everywhere-Web/README.txt +++ b/interfaces/web/Bugs-Everywhere-Web/README @@ -1,7 +1,20 @@ -Bugs-Everywhere-Web +Using BeWeb, the web UI +======================= +BeWeb uses the Turbogears framework: http://www.turbogears.org/ +Please ensure you have Turbogears 0.8a5 or a compatible release installed. +Because it uses BE data, the web UI does not require a database. -This is a TurboGears (http://www.turbogears.org) project. It can be -started by running the start-beweb.py script. +To use BeWeb, first create a configuration file, telling it which projects +to track, and what to call them. An example configuration file +(beweb/beweb/config.py.example) is provided. + +Next, cd to this directory, and run ./start-beweb.py + +BeWeb allows you to create, view and edit bugs, but it is in an early stage of +development, so some features are missing. + +Configuration file +------------------ Configure by creating an appropriate beweb/config.py from beweb/config.py.example. The server will edit the repositories that @@ -13,6 +26,9 @@ See http://docs.turbogears.org/1.0/Configuration For standard turbogears configuration information. +Actions +------- + Currently, you need to login for any methods with a @identity.require() decorator. The only group in the current implementation is 'editbugs'. Basically, anyone can browse around, @@ -27,6 +43,8 @@ Editbugs required actions: * Reply to comments * Update comment info +Users +----- All login attempts will fail unless you have added some valid users. See http://docs.turbogears.org/1.0/GettingStartedWithIdentity diff --git a/interfaces/xml/be-xml-to-mbox b/interfaces/xml/be-xml-to-mbox index c630447..7960d56 100755 --- a/interfaces/xml/be-xml-to-mbox +++ b/interfaces/xml/be-xml-to-mbox @@ -1,6 +1,5 @@ #!/usr/bin/env python -# Copyright (C) 2009 Chris Ball <cjb@laptop.org> -# W. Trevor King <wking@drexel.edu> +# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/arch.py b/libbe/arch.py index 98c4edd..4687555 100644 --- a/libbe/arch.py +++ b/libbe/arch.py @@ -1,5 +1,6 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. -# Ben Finney <ben+python@benfinney.id.au> +# Ben Finney <benf@cybersource.com.au> +# Gianluca Montecchi <gian@grys.it> # James Rowe <jnrowe@ukfsn.org> # W. Trevor King <wking@drexel.edu> # diff --git a/libbe/beuuid.py b/libbe/beuuid.py index 490ed62..260f3dc 100644 --- a/libbe/beuuid.py +++ b/libbe/beuuid.py @@ -1,4 +1,5 @@ -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/bug.py b/libbe/bug.py index 6633ab7..48f8358 100644 --- a/libbe/bug.py +++ b/libbe/bug.py @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2009 Chris Ball <cjb@laptop.org> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> # Thomas Habets <thomas@habets.pp.se> # W. Trevor King <wking@drexel.edu> # diff --git a/libbe/bugdir.py b/libbe/bugdir.py index 5324163..5b942d3 100644 --- a/libbe/bugdir.py +++ b/libbe/bugdir.py @@ -1,6 +1,7 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. # Alexander Belchenko <bialix@ukr.net> # Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # Oleg Romanyshyn <oromanyshyn@panoramicfeedback.com> # W. Trevor King <wking@drexel.edu> # diff --git a/libbe/bzr.py b/libbe/bzr.py index 8e91d0c..2cf1cba 100644 --- a/libbe/bzr.py +++ b/libbe/bzr.py @@ -1,5 +1,6 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. -# Ben Finney <ben+python@benfinney.id.au> +# Ben Finney <benf@cybersource.com.au> +# Gianluca Montecchi <gian@grys.it> # Marien Zwart <marienz@gentoo.org> # W. Trevor King <wking@drexel.edu> # diff --git a/libbe/cmdutil.py b/libbe/cmdutil.py index 9b64142..f1c8acd 100644 --- a/libbe/cmdutil.py +++ b/libbe/cmdutil.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # Oleg Romanyshyn <oromanyshyn@panoramicfeedback.com> # W. Trevor King <wking@drexel.edu> # diff --git a/libbe/comment.py b/libbe/comment.py index 17daf62..5f67878 100644 --- a/libbe/comment.py +++ b/libbe/comment.py @@ -1,5 +1,5 @@ # Bugs Everywhere, a distributed bugtracker -# Copyright (C) 2008-2009 Chris Ball <cjb@laptop.org> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> # Thomas Habets <thomas@habets.pp.se> # W. Trevor King <wking@drexel.edu> # diff --git a/libbe/config.py b/libbe/config.py index fb5a028..4f32731 100644 --- a/libbe/config.py +++ b/libbe/config.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/libbe/darcs.py b/libbe/darcs.py index 6bf0119..059452c 100644 --- a/libbe/darcs.py +++ b/libbe/darcs.py @@ -1,4 +1,5 @@ -# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/diff.py b/libbe/diff.py index 9253a23..cce3b0f 100644 --- a/libbe/diff.py +++ b/libbe/diff.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/libbe/editor.py b/libbe/editor.py index ec41006..ed497a0 100644 --- a/libbe/editor.py +++ b/libbe/editor.py @@ -1,5 +1,6 @@ # Bugs Everywhere, a distributed bugtracker -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/encoding.py b/libbe/encoding.py index fd513b5..b0a04cc 100644 --- a/libbe/encoding.py +++ b/libbe/encoding.py @@ -1,5 +1,6 @@ # Bugs Everywhere, a distributed bugtracker -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/git.py b/libbe/git.py index 781a278..cb4436a 100644 --- a/libbe/git.py +++ b/libbe/git.py @@ -1,5 +1,6 @@ -# Copyright (C) 2008-2009 Ben Finney <ben+python@benfinney.id.au> +# Copyright (C) 2008-2009 Ben Finney <benf@cybersource.com.au> # Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/libbe/hg.py b/libbe/hg.py index 40739b6..d7eb796 100644 --- a/libbe/hg.py +++ b/libbe/hg.py @@ -1,5 +1,6 @@ # Copyright (C) 2007-2009 Aaron Bentley and Panometrics, Inc. -# Ben Finney <ben+python@benfinney.id.au> +# Ben Finney <benf@cybersource.com.au> +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/libbe/mapfile.py b/libbe/mapfile.py index d0e16fe..062606b 100644 --- a/libbe/mapfile.py +++ b/libbe/mapfile.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/libbe/plugin.py b/libbe/plugin.py index d593d69..bd9bb65 100644 --- a/libbe/plugin.py +++ b/libbe/plugin.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # Marien Zwart <marienz@gentoo.org> # W. Trevor King <wking@drexel.edu> # diff --git a/libbe/properties.py b/libbe/properties.py index 09dd20e..54375b4 100644 --- a/libbe/properties.py +++ b/libbe/properties.py @@ -1,5 +1,6 @@ # Bugs Everywhere - a distributed bugtracker -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/settings_object.py b/libbe/settings_object.py index ceea9d5..7efda5b 100644 --- a/libbe/settings_object.py +++ b/libbe/settings_object.py @@ -1,5 +1,6 @@ # Bugs Everywhere - a distributed bugtracker -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/tree.py b/libbe/tree.py index 06d09e5..1bfd803 100644 --- a/libbe/tree.py +++ b/libbe/tree.py @@ -1,5 +1,6 @@ # Bugs Everywhere, a distributed bugtracker -# Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu> +# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it> +# W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/libbe/utility.py b/libbe/utility.py index 1e43516..4126913 100644 --- a/libbe/utility.py +++ b/libbe/utility.py @@ -1,4 +1,5 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/libbe/vcs.py b/libbe/vcs.py index ba23858..1ac5dd9 100644 --- a/libbe/vcs.py +++ b/libbe/vcs.py @@ -1,7 +1,8 @@ # Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. # Alexander Belchenko <bialix@ukr.net> -# Ben Finney <ben+python@benfinney.id.au> +# Ben Finney <benf@cybersource.com.au> # Chris Ball <cjb@laptop.org> +# Gianluca Montecchi <gian@grys.it> # W. Trevor King <wking@drexel.edu> # # This program is free software; you can redistribute it and/or modify diff --git a/update_copyright.py b/update_copyright.py new file mode 100755 index 0000000..4a52fee --- /dev/null +++ b/update_copyright.py @@ -0,0 +1,454 @@ +#!/usr/bin/python +# +# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import os.path +import re +import sys +import time + +import os +import sys +import select +from subprocess import Popen, PIPE, mswindows +from threading import Thread + +COPYRIGHT_TEXT="""# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.""" + +COPYRIGHT_TAG='-xyz-COPYRIGHT-zyx-' # unlikely to occur in the wild :p + +ALIASES = [ + ['Ben Finney <benf@cybersource.com.au>', + 'Ben Finney <ben+python@benfinney.id.au>', + 'John Doe <jdoe@example.com>'], + ['Chris Ball <cjb@laptop.org>', + 'Chris Ball <cjb@thunk.printf.net>'], + ['Gianluca Montecchi <gian@grys.it>', + 'gian <gian@li82-39>', + 'gianluca <gian@galactica>'], + ['W. Trevor King <wking@drexel.edu>', + 'wking <wking@mjolnir>'], + [None, + 'j^ <j@oil21.org>'], + ] +COPYRIGHT_ALIASES = [ + ['Aaron Bentley and Panometrics, Inc.', + 'Aaron Bentley <abentley@panoramicfeedback.com>'], + ] +EXCLUDES = [ + ['Aaron Bentley and Panometrics, Inc.', + 'Aaron Bentley <aaron.bentley@utoronto.ca>',] + ] + + +IGNORED_PATHS = ['./.be/', './.bzr/', './build/'] +IGNORED_FILES = ['COPYING', 'update_copyright.py', 'catmutt'] + +class Pipe (object): + """ + Simple interface for executing POSIX-style pipes based on the + subprocess module. The only complication is the adaptation of + subprocess.Popen._comminucate to listen to the stderrs of all + processes involved in the pipe, as well as the terminal process' + stdout. There are two implementations of Pipe._communicate, one + for MS Windows, and one for POSIX systems. The MS Windows + implementation is currently untested. + + >>> p = Pipe([['find', '/etc/'], ['grep', '^/etc/ssh$']]) + >>> p.stdout + '/etc/ssh\\n' + >>> p.status + 1 + >>> p.statuses + [1, 0] + >>> p.stderrs # doctest: +ELLIPSIS + ["find: `...': Permission denied\\n...", ''] + """ + def __init__(self, cmds, stdin=None): + # spawn processes + self._procs = [] + for cmd in cmds: + if len(self._procs) != 0: + stdin = self._procs[-1].stdout + self._procs.append(Popen(cmd, stdin=stdin, stdout=PIPE, stderr=PIPE)) + + self.stdout,self.stderrs = self._communicate(input=None) + + # collect process statuses + self.statuses = [] + self.status = 0 + for proc in self._procs: + self.statuses.append(proc.wait()) + if self.statuses[-1] != 0: + self.status = self.statuses[-1] + + # Code excerpted from subprocess.Popen._communicate() + if mswindows == True: + def _communicate(self, input=None): + assert input == None, "stdin != None not yet supported" + # listen to each process' stderr + threads = [] + std_X_arrays = [] + for proc in self._procs: + stderr_array = [] + thread = Thread(target=proc._readerthread, + args=(proc.stderr, stderr_array)) + thread.setDaemon(True) + thread.start() + threads.append(thread) + std_X_arrays.append(stderr_array) + + # also listen to the last processes stdout + stdout_array = [] + thread = Thread(target=proc._readerthread, + args=(proc.stdout, stdout_array)) + thread.setDaemon(True) + thread.start() + threads.append(thread) + std_X_arrays.append(stdout_array) + + # join threads as they die + for thread in threads: + thread.join() + + # read output from reader threads + std_X_strings = [] + for std_X_array in std_X_arrays: + std_X_strings.append(std_X_array[0]) + + stdout = std_X_strings.pop(-1) + stderrs = std_X_strings + return (stdout, stderrs) + else: # POSIX + def _communicate(self, input=None): + read_set = [] + write_set = [] + read_arrays = [] + stdout = None # Return + stderr = None # Return + + if self._procs[0].stdin: + # Flush stdio buffer. This might block, if the user has + # been writing to .stdin in an uncontrolled fashion. + self._procs[0].stdin.flush() + if input: + write_set.append(self._procs[0].stdin) + else: + self._procs[0].stdin.close() + for proc in self._procs: + read_set.append(proc.stderr) + read_arrays.append([]) + read_set.append(self._procs[-1].stdout) + read_arrays.append([]) + + input_offset = 0 + while read_set or write_set: + try: + rlist, wlist, xlist = select.select(read_set, write_set, []) + except select.error, e: + if e.args[0] == errno.EINTR: + continue + raise + if self._procs[0].stdin in wlist: + # When select has indicated that the file is writable, + # we can write up to PIPE_BUF bytes without risk + # blocking. POSIX defines PIPE_BUF >= 512 + chunk = input[input_offset : input_offset + 512] + bytes_written = os.write(self.stdin.fileno(), chunk) + input_offset += bytes_written + if input_offset >= len(input): + self._procs[0].stdin.close() + write_set.remove(self._procs[0].stdin) + if self._procs[-1].stdout in rlist: + data = os.read(self._procs[-1].stdout.fileno(), 1024) + if data == "": + self._procs[-1].stdout.close() + read_set.remove(self._procs[-1].stdout) + read_arrays[-1].append(data) + for i,proc in enumerate(self._procs): + if proc.stderr in rlist: + data = os.read(proc.stderr.fileno(), 1024) + if data == "": + proc.stderr.close() + read_set.remove(proc.stderr) + read_arrays[i].append(data) + + # All data exchanged. Translate lists into strings. + read_strings = [] + for read_array in read_arrays: + read_strings.append(''.join(read_array)) + + stdout = read_strings.pop(-1) + stderrs = read_strings + return (stdout, stderrs) + +def _strip_email(*args): + """ + >>> _strip_email('J Doe <jdoe@a.com>') + ['J Doe'] + >>> _strip_email('J Doe <jdoe@a.com>', 'JJJ Smith <jjjs@a.com>') + ['J Doe', 'JJJ Smith'] + """ + args = list(args) + for i,arg in enumerate(args): + if arg == None: + continue + index = arg.find('<') + if index > 0: + args[i] = arg[:index].rstrip() + return args + +def _replace_aliases(authors, with_email=True, aliases=None, + excludes=None): + """ + >>> aliases = [['J Doe and C, Inc.', 'J Doe <jdoe@c.com>'], + ... ['J Doe <jdoe@a.com>', 'Johnny <jdoe@b.edu>'], + ... ['JJJ Smith <jjjs@a.com>', 'Jingly <jjjs@b.edu>'], + ... [None, 'Anonymous <a@a.com>']] + >>> excludes = [['J Doe and C, Inc.', 'J Doe <jdoe@a.com>']] + >>> _replace_aliases(['JJJ Smith <jjjs@a.com>', 'Johnny <jdoe@b.edu>', + ... 'Jingly <jjjs@b.edu>', 'Anonymous <a@a.com>'], + ... with_email=True, aliases=aliases, excludes=excludes) + ['J Doe <jdoe@a.com>', 'JJJ Smith <jjjs@a.com>'] + >>> _replace_aliases(['JJJ Smith', 'Johnny', 'Jingly', 'Anonymous'], + ... with_email=False, aliases=aliases, excludes=excludes) + ['J Doe', 'JJJ Smith'] + >>> _replace_aliases(['JJJ Smith <jjjs@a.com>', 'Johnny <jdoe@b.edu>', + ... 'Jingly <jjjs@b.edu>', 'J Doe <jdoe@c.com>'], + ... with_email=True, aliases=aliases, excludes=excludes) + ['J Doe and C, Inc.', 'JJJ Smith <jjjs@a.com>'] + """ + if aliases == None: + aliases = ALIASES + if excludes == None: + excludes = EXCLUDES + if with_email == False: + aliases = [_strip_email(*alias) for alias in aliases] + exclude = [_strip_email(*exclude) for exclude in excludes] + for i,author in enumerate(authors): + for alias in aliases: + if author in alias[1:]: + authors[i] = alias[0] + break + for i,author in enumerate(authors): + for exclude in excludes: + if author in exclude[1:] and exclude[0] in authors: + authors[i] = None + authors = sorted(set(authors)) + if None in authors: + authors.remove(None) + return authors + +def authors_list(): + p = Pipe([['bzr', 'log', '-n0'], + ['grep', '^ *committer\|^ *author'], + ['cut', '-d:', '-f2'], + ['sed', 's/ <.*//;s/^ *//'], + ['sort'], + ['uniq']]) + assert p.status == 0, p.statuses + authors = p.stdout.rstrip().split('\n') + return _replace_aliases(authors, with_email=False) + +def update_authors(verbose=True): + print "updating AUTHORS" + f = file('AUTHORS', 'w') + authors_text = 'Bugs Everywhere was written by:\n%s\n' % '\n'.join(authors_list()) + f.write(authors_text) + f.close() + +def ignored_file(filename, ignored_paths=None, ignored_files=None): + """ + >>> ignored_paths = ['./a/', './b/'] + >>> ignored_files = ['x', 'y'] + >>> ignored_file('./a/z', ignored_paths, ignored_files) + True + >>> ignored_file('./ab/z', ignored_paths, ignored_files) + False + >>> ignored_file('./ab/x', ignored_paths, ignored_files) + True + >>> ignored_file('./ab/xy', ignored_paths, ignored_files) + False + >>> ignored_file('./z', ignored_paths, ignored_files) + False + """ + if ignored_paths == None: + ignored_paths = IGNORED_PATHS + if ignored_files == None: + ignored_files = IGNORED_FILES + for path in ignored_paths: + if filename.startswith(path): + return True + if os.path.basename(filename) in ignored_files: + return True + if os.path.abspath(filename) != os.path.realpath(filename): + return True # symink somewhere in path... + return False + +def _copyright_string(orig_year, final_year, authors): + """ + >>> print _copyright_string(orig_year=2005, + ... final_year=2005, + ... authors=['A <a@a.com>', 'B <b@b.edu>'] + ... ) # doctest: +ELLIPSIS + # Copyright (C) 2005 A <a@a.com> + # B <b@b.edu> + # + # This program... + >>> print _copyright_string(orig_year=2005, + ... final_year=2009, + ... authors=['A <a@a.com>', 'B <b@b.edu>'] + ... ) # doctest: +ELLIPSIS + # Copyright (C) 2005-2009 A <a@a.com> + # B <b@b.edu> + # + # This program... + """ + if orig_year == final_year: + date_range = '%s' % orig_year + else: + date_range = '%s-%s' % (orig_year, final_year) + lines = ['# Copyright (C) %s %s' % (date_range, authors[0])] + for author in authors[1:]: + lines.append('#' + + ' '*(len(' Copyright (C) ')+len(date_range)+1) + + author) + return '%s\n%s' % ('\n'.join(lines), COPYRIGHT_TEXT) + +def _tag_copyright(contents): + """ + >>> contents = '''Some file + ... bla bla + ... # Copyright (copyright begins) + ... # (copyright continues) + ... # bla bla bla + ... (copyright ends) + ... bla bla bla + ... ''' + >>> print _tag_copyright(contents), + Some file + bla bla + -xyz-COPYRIGHT-zyx- + (copyright ends) + bla bla bla + """ + lines = [] + incopy = False + for line in contents.splitlines(): + if incopy == False and line.startswith('# Copyright'): + incopy = True + lines.append(COPYRIGHT_TAG) + elif incopy == True and not line.startswith('#'): + incopy = False + if incopy == False: + lines.append(line.rstrip('\n')) + return '\n'.join(lines)+'\n' + +def _update_copyright(contents, orig_year, authors): + current_year = time.gmtime()[0] + copyright_string = _copyright_string(orig_year, current_year, authors) + contents = _tag_copyright(contents) + return contents.replace(COPYRIGHT_TAG, copyright_string) + +def update_file(filename, verbose=True): + if verbose == True: + print "updating", filename + contents = file(filename, 'r').read() + + p = Pipe([['bzr', 'log', '-n0', filename], + ['grep', '^ *timestamp: '], + ['tail', '-n1'], + ['sed', 's/^ *//;'], + ['cut', '-b', '16-19']]) + if p.status != 0: + assert p.statuses[0] == 3, p.statuses + return # bzr doesn't version that file + assert p.status == 0, p.statuses + orig_year = int(p.stdout.strip()) + + p = Pipe([['bzr', 'log', '-n0', filename], + ['grep', '^ *author: \|^ *committer: '], + ['cut', '-d:', '-f2'], + ['sed', 's/^ *//;s/ *$//'], + ['sort'], + ['uniq']]) + assert p.status == 0, p.statuses + authors = p.stdout.rstrip().split('\n') + authors = _replace_aliases(authors, with_email=True, + aliases=ALIASES+COPYRIGHT_ALIASES) + + contents = _update_copyright(contents, orig_year, authors) + f = file(filename, 'w') + f.write(contents) + f.close() + +def test(): + import doctest + doctest.testmod() + +if __name__ == '__main__': + import optparse + usage = """%prog [options] [file ...] + +Update copyright information in source code with information from +the bzr repository. Run from the BE repository root. + +Replaces every line starting with '^# Copyright' and continuing with +'^#' with an auto-generated copyright blurb. If you want to add +#-commented material after a copyright blurb, please insert a blank +line between the blurb and your comment (as in this file), so the +next run of update_copyright.py doesn't clobber your comment. + +If no files are given, a list of files to update is generated +automatically. +""" + p = optparse.OptionParser(usage) + p.add_option('--test', dest='test', default=False, + action='store_true', help='Run internal tests and exit') + options,args = p.parse_args() + + if options.test == True: + test() + sys.exit(0) + + update_authors() + + files = args + if len(files) == 0: + p = Pipe([['grep', '-rc', '# Copyright', '.'], + ['grep', '-v', ':0$'], + ['cut', '-d:', '-f1']]) + assert p.status == 0 + files = p.stdout.rstrip().split('\n') + + for filename in files: + if ignored_file(filename) == True: + continue + update_file(filename) diff --git a/update_copyright.sh b/update_copyright.sh deleted file mode 100755 index 84a5913..0000000 --- a/update_copyright.sh +++ /dev/null @@ -1,158 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2009 W. Trevor King <wking@drexel.edu> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -# Update copyright information in source code with information from -# the bzr repository. Run from the BE repository root. -# -# Replaces everything starting with '^# Copyright' and continuing with -# '^#' with an auto-generated copyright blurb. If you want to add -# #-commented material after a copyright blurb, please insert a blank -# line between the blurb and your comment (as in this file), so the -# next run of update_copyright.sh doesn't clobber your comment. -# -# usage: update_copyright.sh [files ...] -# -# If no files are given, a list of files to update is generated -# automatically. - -set -o pipefail - -if [ $# -gt 0 ]; then - FILES="$*" -else - FILES=`grep -rc "# Copyright" . | grep -v ':0$' | cut -d: -f1` -fi - -COPYRIGHT_TEXT="# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." -# escape newlines and special characters -SED_RM_TRAIL_END='s/[\]n$//' # strip trailing newline escape -SED_ESC_SPECIAL='s/\([()/]\)/\\\1/g' # escape special characters -ESCAPED_TEXT=`echo "$COPYRIGHT_TEXT" | awk '{printf("%s\\\\n", $0)}' | sed "$SED_RM_TRAIL_END" | sed "$SED_ESC_SPECIAL"` - -# adjust the AUTHORS file -AUTHORS=`bzr log | grep '^ *committer\|^ *author' | cut -d: -f2 | sed 's/ <.*//;s/^ *//' | sort | uniq` -AUTHORS=`echo "$AUTHORS" | grep -v 'j\^\|wking\|John Doe\|gianluca'` # remove non-names -echo "Bugs Everywhere was written by:" > AUTHORS -echo "$AUTHORS" >> AUTHORS - -CURRENT_YEAR=`date +"%Y"` -TMP=`mktemp BE_update_copyright.XXXXXXX` - -for file in $FILES -do - # Ignore some files - if [ "${file:0:5}" == "./.be" ]; then - continue - fi - if [ "${file:0:6}" == "./.bzr" ]; then - continue - fi - if [ "${file:0:7}" == "./build" ]; then - continue - fi - if [ "$file" == "./COPYING" ]; then - continue - fi - if [ "$file" == "./update_copyright.sh" ]; then - continue - fi - if [ "$file" == "./xml/catmutt" ]; then - continue - fi - echo "Processing $file" - - # Get author history from bzr - AUTHORS=`bzr log "$file" | grep "^ *author: \|^ *committer: " | cut -d: -f2 | sed 's/^ *//;s/ *$//' | sort | uniq` - if [ $? -ne 0 ]; then - continue # bzr doesn't version that file - fi - ORIG_YEAR=`bzr log "$file" | grep "^ *timestamp: " | tail -n1 | sed 's/^ *//;' | cut -b 16-19` - - # Tweak the author list to make up for problems in the bzr - # history, change of email address, etc. - - # Consolidate Chris Ball - GREP_OUT=`echo "$AUTHORS" | grep 'Chris Ball <cjb@laptop.org>'` - if [ -n "$GREP_OUT" ]; then - AUTHORS=`echo "$AUTHORS" | grep -v '^Chris Ball <cjb@thunk.printf.net>$'` - fi - - # Consolidate Aaron Bentley - AUTHORS=`echo "$AUTHORS" | sed 's/<abentley@panoramicfeedback.com>/and Panometrics, Inc./'` - GREP_OUT=`echo "$AUTHORS" | grep 'Aaron Bentley and Panometrics, Inc.'` - if [ -n "$GREP_OUT" ]; then - AUTHORS=`echo "$AUTHORS" | grep -v '^Aaron Bentley <aaron.bentley@utoronto.ca>$'` - fi - - # Consolidate Ben Finney - AUTHORS=`echo "$AUTHORS" | sed 's/John Doe <jdoe@example.com>/Ben Finney <ben+python@benfinney.id.au>/'` - GREP_OUt=`echo "$AUTHORS" | grep 'Ben Finney <ben+python@benfinney.id.au>'` - if [ -n "$GREP_OUT" ]; then - AUTHORS=`echo "$AUTHORS" | grep -v '^Ben Finney <benf@cybersource.com.au>$'` - fi - - # Consolidate Trevor King - AUTHORS=`echo "$AUTHORS" | grep -v "wking <wking@mjolnir>"` - - # Consolidate Gianluca Montecchi - AUTHORS=`echo "$AUTHORS" | grep -v "gianluca"` - - # Sort again... - AUTHORS=`echo "$AUTHORS" | sort | uniq` - - # Generate new Copyright string - if [ "$ORIG_YEAR" == "$CURRENT_YEAR" ]; then - DATE_RANGE="$CURRENT_YEAR" - DATE_SPACE=" " - else - DATE_RANGE="${ORIG_YEAR}-${CURRENT_YEAR}" - DATE_SPACE=" " - fi - NUM_AUTHORS=`echo "$AUTHORS" | wc -l` - FIRST_AUTHOR=`echo "$AUTHORS" | head -n 1` - COPYRIGHT="# Copyright (C) $DATE_RANGE $FIRST_AUTHOR" - if [ $NUM_AUTHORS -gt 1 ]; then - OTHER_AUTHORS=`echo "$AUTHORS" | tail -n +2` - while read AUTHOR; do - COPYRIGHT=`echo "$COPYRIGHT\\n# $DATE_SPACE $AUTHOR"` - done < <(echo "$OTHER_AUTHORS") - fi - COPYRIGHT=`echo "$COPYRIGHT\\n$ESCAPED_TEXT"` - - # Strip old copyright info and replace with tag - awk 'BEGIN{incopy==0}{if(match($0, "^# Copyright")>0){incopy=1; print "-xyz-COPYRIGHT-zyx-"}else{if(incopy==0){print $0}else{if(match($0, "^#")==0){incopy=0; print $0}}}}' "$file" > "$TMP" - - # Replace tag in with new string - sed -i "s/^-xyz-COPYRIGHT-zyx-$/$COPYRIGHT/" "$TMP" - cp "$TMP" "$file" -done - -rm -f "$TMP" |