Thread: [Codestriker-commits] CVS update: codestriker codestriker.conf
Brought to you by:
sits
From: <si...@us...> - 2005-07-10 23:25:16
|
Created Codestriker topic at: http://codestriker.sourceforge.net/cgi-bin/codestriker.pl?topic=7930309&action=view User: sits Date: 05/07/10 16:24:57 Modified: . codestriker.conf Log: Updated example to include host information for PgPP URL. Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- codestriker.conf 10 Jul 2005 02:28:56 -0000 1.74 +++ codestriker.conf 10 Jul 2005 23:24:56 -0000 1.75 @@ -16,7 +16,7 @@ # Example of a PostgreSQL database URL using the PgPP driver (required for # Win32 systems at the time of release). -#$db = 'DBI:PgPP:dbname=codestrikerdb'; +#$db = 'DBI:PgPP:host=locahost;dbname=codestrikerdb'; # Example of a MySQL database URL. #$db = 'DBI:mysql:dbname=codestrikerdb'; |
From: <si...@us...> - 2005-07-11 23:31:36
|
Created Codestriker topic at: http://codestriker.sourceforge.net/cgi-bin/codestriker.pl?topic=9137920&action=view User: sits Date: 05/07/11 16:31:19 Modified: . codestriker.conf Log: Remove PgPP example, its very buggy. Postgres for Windows is not possible, just yet, until they release a Pg driver. Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.75 retrieving revision 1.76 diff -u -r1.75 -r1.76 --- codestriker.conf 10 Jul 2005 23:24:56 -0000 1.75 +++ codestriker.conf 11 Jul 2005 23:31:14 -0000 1.76 @@ -14,10 +14,6 @@ # Example of a PostgreSQL database URL using the native Pg driver. $db = 'DBI:Pg:dbname=codestrikerdb'; -# Example of a PostgreSQL database URL using the PgPP driver (required for -# Win32 systems at the time of release). -#$db = 'DBI:PgPP:host=locahost;dbname=codestrikerdb'; - # Example of a MySQL database URL. #$db = 'DBI:mysql:dbname=codestrikerdb'; |
From: <si...@us...> - 2005-07-12 10:12:21
|
Created Codestriker topic at: http://codestriker.sourceforge.net/cgi-bin/codestriker.pl?topic=1378987&action=view User: sits Date: 05/07/12 03:12:03 Modified: . codestriker.conf Log: Reordered db config options Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.76 retrieving revision 1.77 diff -u -r1.76 -r1.77 --- codestriker.conf 11 Jul 2005 23:31:14 -0000 1.76 +++ codestriker.conf 12 Jul 2005 10:12:01 -0000 1.77 @@ -2,9 +2,12 @@ # Configuration file for codestriker.pl. # Database to use for storing codestriker data. Examples given are -# Oracle, SQL Server, PostgreSQL and MySQL. Refer to the +# MySQL, Oracle, SQL Server, and PostgreSQL Refer to the # documentation on how to create the Codestriker database. +# Example of a MySQL database URL. +$db = 'DBI:mysql:dbname=codestrikerdb'; + # Example of an oracle database URL. #$db = 'DBI:Oracle:host=127.0.0.1;sid=local'; @@ -12,10 +15,7 @@ #$db = 'DBI:ODBC:Codestriker'; # Example of a PostgreSQL database URL using the native Pg driver. -$db = 'DBI:Pg:dbname=codestrikerdb'; - -# Example of a MySQL database URL. -#$db = 'DBI:mysql:dbname=codestrikerdb'; +#$db = 'DBI:Pg:dbname=codestrikerdb'; # Database user. #$dbuser = 'system'; |
From: <si...@us...> - 2005-07-27 10:51:14
|
Created Codestriker topic at: http://codestriker.sourceforge.net/cgi-bin/codestriker.pl?topic=2750818&action=view User: sits Date: 05/07/27 03:50:58 Modified: . codestriker.conf Log: Added remote database host example. Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.77 retrieving revision 1.78 diff -u -r1.77 -r1.78 --- codestriker.conf 12 Jul 2005 10:12:01 -0000 1.77 +++ codestriker.conf 27 Jul 2005 10:50:57 -0000 1.78 @@ -8,6 +8,9 @@ # Example of a MySQL database URL. $db = 'DBI:mysql:dbname=codestrikerdb'; +# Example of a MySQL database on host dbhost. +#$db = 'DBI:mysql:dbname=codestrikerdb;host=dbhost'; + # Example of an oracle database URL. #$db = 'DBI:Oracle:host=127.0.0.1;sid=local'; |
From: <si...@us...> - 2007-07-12 23:39:19
|
User: sits Date: 07/07/12 16:39:18 Modified: . codestriker.conf Log: Remove old entry Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.88 retrieving revision 1.89 diff -u -r1.88 -r1.89 --- codestriker.conf 7 Jun 2007 04:46:27 -0000 1.88 +++ codestriker.conf 12 Jul 2007 23:39:17 -0000 1.89 @@ -188,8 +188,6 @@ # 'clearcase:dyn:viewname:/vobs' ); -@valid_repositories = (); - # A mapping of repository URLs to names. In any screen where a # repository is displayed, if there is a mapping for the repository # defined here, then the symbolic name will be displayed instead of |
From: <si...@us...> - 2008-06-17 11:51:02
|
User: sits Date: 08/06/17 04:51:00 Modified: lib/Codestriker/Http DeltaRenderer.pm . codestriker.conf Log: If the highlighter is not defined, fallback to the old-style Codestriker html formatting. Index: DeltaRenderer.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Http/DeltaRenderer.pm,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- DeltaRenderer.pm 17 Jun 2008 11:09:34 -0000 1.8 +++ DeltaRenderer.pm 17 Jun 2008 11:50:59 -0000 1.9 @@ -52,20 +52,21 @@ $self->{comment_locations} = \@comment_locations; $self->{comment_location_map} = \%comment_location_map; - # Record list of line filter objects to apply to each line of code. - # Setup some default filters. - my $lxr_config = defined $repository ? - $Codestriker::lxr_map->{$repository->toString()} : undef; - + # If the highlighter has been configured, use that for converting the + # code to html. @{$self->{line_filters}} = (); - push @{$self->{line_filters}}, Codestriker::Http::HighlightLineFilter->new($Codestriker::highlight); - - #push @{$self->{line_filters}}, Codestriker::Http::HtmlEntityLineFilter->new(); - #push @{$self->{line_filters}}, Codestriker::Http::TabToNbspLineFilter->new($tabwidth); - #push @{$self->{line_filters}}, Codestriker::Http::LineBreakLineFilter->new($brmode); - #if (defined $lxr_config) { - # push @{$self->{line_filters}}, Codestriker::Http::LxrLineFilter->new($lxr_config); - #} + if (defined $Codestriker::highlighter && $Codestriker::highlighter ne '') { + push @{$self->{line_filters}}, Codestriker::Http::HighlightLineFilter->new($Codestriker::highlighter); + } else { + push @{$self->{line_filters}}, Codestriker::Http::HtmlEntityLineFilter->new(); + push @{$self->{line_filters}}, Codestriker::Http::TabToNbspLineFilter->new($tabwidth); + push @{$self->{line_filters}}, Codestriker::Http::LineBreakLineFilter->new($brmode); + my $lxr_config = defined $repository ? + $Codestriker::lxr_map->{$repository->toString()} : undef; + if (defined $lxr_config) { + push @{$self->{line_filters}}, Codestriker::Http::LxrLineFilter->new($lxr_config); + } + } bless $self, $type; } Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.93 retrieving revision 1.94 diff -u -r1.93 -r1.94 --- codestriker.conf 17 Jun 2008 11:09:35 -0000 1.93 +++ codestriker.conf 17 Jun 2008 11:50:59 -0000 1.94 @@ -77,8 +77,10 @@ $vss = 'C:/Program Files/Microsoft Visual Studio/VSS/win32/ss.exe'; # Location of the highlight binary, which is used for highlighting source code. -# Available from http://www.andre-simon.de/. -$highlight = 'C:/Program Files/WinHighlight/highlight.exe'; +# Available from http://www.andre-simon.de/. If this is not set, no syntax +# highlighting will be performed. +$highlighter = ''; +#$highlighter = 'C:/Program Files/WinHighlight/highlight.exe'; # Temporary directory Codestriker can use. For *NIX platforms, this will # /tmp by default, for Windows 2000 c:\winnt\temp and for XP, c:\windows\temp. |
From: <si...@us...> - 2008-06-19 03:35:05
|
User: sits Date: 08/06/18 20:35:04 Modified: . codestriker.conf Log: Remove the brmode configuration since it is no longer used. Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.94 retrieving revision 1.95 diff -u -r1.94 -r1.95 --- codestriker.conf 17 Jun 2008 11:50:59 -0000 1.94 +++ codestriker.conf 19 Jun 2008 03:35:03 -0000 1.95 @@ -262,20 +262,6 @@ $default_topic_create_mode = $COLOURED_MODE; -# The default line break viewing mode to use in the URL when viewing a -# topic. Can be either $LINE_BREAK_NORMAL_MODE or $LINE_BREAK_ASSIST_MODE. -# Using $LINE_BREAK_ASSIST_MODE indicates that extra line breaks may be -# used in the topic display if the review has very long code lines. Using -# $LINE_BREAK_NORMAL_MODE will ensure that the display matches the line -# breaks present in the code. The line break mode can also be changed -# dynamically in the view topic screen. There is usually no need to -# change this setting unless you regularly review code with very long -# lines. -$LINE_BREAK_NORMAL_MODE = 1; -$LINE_BREAK_ASSIST_MODE = 2; - -$default_topic_br_mode = $LINE_BREAK_NORMAL_MODE; - # When displaying a topic, if this value is -1, then all files in the # topic are displayed in the one page (default old Codestriker # behaviour). If the value is 0, then only the first file is shown, |
From: <si...@us...> - 2008-06-21 10:21:48
|
User: sits Date: 08/06/21 03:21:37 Modified: . codestriker.conf Log: Remove $testdirector_file_list as it is no longer needed. Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.95 retrieving revision 1.96 diff -u -r1.95 -r1.96 --- codestriker.conf 19 Jun 2008 03:35:03 -0000 1.95 +++ codestriker.conf 21 Jun 2008 10:21:36 -0000 1.96 @@ -381,7 +381,6 @@ #$testdirector_password = ''; #$testdirector_domain = 'DEFAULT'; #$testdirector_project = 'BPM33'; -#$testdirector_file_list = 'BG_USER_29'; # The URL to the bug tracking system. The bug number is appended to the # end of this string when URLs are generated. This can be left blank if |
From: <si...@us...> - 2008-06-21 11:02:40
|
User: sits Date: 08/06/21 03:55:57 Modified: lib/Codestriker/Http Response.pm UrlBuilder.pm . codestriker.conf Added: html codestriker-bluish.css Log: * Added a new CSS file as a part of the distribution which provides a bluish scheme, called codestriker-bluish.css is the html directory. This CSS file can be set from within codestriker.conf and was contributed by Kannan Goundan <ca...@us...>. The ability to easily change which CSS file to use was submitted by rob...@us.... Index: Response.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Http/Response.pm,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- Response.pm 14 Mar 2008 01:30:52 -0000 1.43 +++ Response.pm 21 Jun 2008 10:55:56 -0000 1.44 @@ -215,25 +215,31 @@ $title = HTML::Entities::encode($title); # Generate the URL to the codestriker CSS file. - my $codestriker_css; + my $codestriker_css = $query->url(); if (defined $Codestriker::codestriker_css && $Codestriker::codestriker_css ne "") { - $codestriker_css = $Codestriker::codestriker_css; + if ($Codestriker::codestriker_css =~ /[\/\\]/o) { + # Assume CSS file is specified with absolute path. + $codestriker_css = $Codestriker::codestriker_css; + } else { + # Assume CSS file is in case html directory, just under + # a different name. + $codestriker_css =~ s/\/.+?\/codestriker\.pl/\/codestrikerhtml\/$Codestriker::codestriker_css/; + } } else { - $codestriker_css = $query->url(); - $codestriker_css =~ s/\/[\w\-]+\/codestriker\.pl/\/codestrikerhtml\/codestriker\.css/; + # Use the default CSS file. + $codestriker_css =~ s/\/.+?\/codestriker\.pl/\/codestrikerhtml\/codestriker\.css/; } - my $overlib_js = $codestriker_css; - $overlib_js =~ s/codestriker.css/overlib.js/o; - my $overlib_centerpopup_js = $codestriker_css; - $overlib_centerpopup_js =~ s/codestriker.css/overlib_centerpopup.js/o; - my $overlib_draggable_js = $codestriker_css; - $overlib_draggable_js =~ s/codestriker.css/overlib_draggable.js/o; - my $xbdhtml_js = $codestriker_css; - $xbdhtml_js =~ s/codestriker.css/xbdhtml.js/o; - my $codestriker_js = $codestriker_css; - $codestriker_js =~ s/codestriker.css/codestriker.js/o; + + my $codestrikerhtml_path = $codestriker_css; + $codestrikerhtml_path =~ s/\/[\w\-]*.css/\//; + my $overlib_js = $codestrikerhtml_path . "overlib.js"; + my $overlib_centerpopup_js = $codestrikerhtml_path . "overlib_centerpopup.js"; + my $overlib_draggable_js = $codestrikerhtml_path . "overlib_draggable.js"; + my $xbdhtml_js = $codestrikerhtml_path . "xbdhtml.js"; + my $codestriker_js = $codestrikerhtml_path . "codestriker.js"; + # Print the basic HTML header header, with the inclusion of the scripts. print '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'; Index: UrlBuilder.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Http/UrlBuilder.pm,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- UrlBuilder.pm 19 Jun 2008 03:33:50 -0000 1.31 +++ UrlBuilder.pm 21 Jun 2008 10:55:56 -0000 1.32 @@ -31,13 +31,14 @@ $self->{url_prefix} = $query->url(-relative=>1); } - # Check if the HTML files are accessible vi another URL (required for + # Check if the HTML files are accessible via another URL (required for # sourceforge deployment). Check $Codestriker::codestriker_css. my $htmlurl; if (defined $Codestriker::codestriker_css && - $Codestriker::codestriker_css ne "") { + $Codestriker::codestriker_css ne "" && + $Codestriker::codestriker_css =~ /[\/\\]/o) { $htmlurl = $Codestriker::codestriker_css; - $htmlurl =~ s/\/codestriker\.css//; + $htmlurl =~ s/\/.+?\.css//; } else { # Standard Codestriker deployment. Index: codestriker-bluish.css =================================================================== RCS file: codestriker-bluish.css diff -N codestriker-bluish.css --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ codestriker-bluish.css 21 Jun 2008 10:55:57 -0000 1.1 @@ -0,0 +1,173 @@ +/* CSS for codestriker */ + +BODY {background-color: #fff;} + +H1 {font-family: Tahoma, Verdana, Bitstream Vera Sans, sans-serif;} + +/* Links */ +A:link {color: #081020;} +A:visited {color: #101828;} + +/* File heading */ +TD.file {background-color: #cccccc; font-family: Georgia, serif; font-size: medium} + +/* Line heading */ +TD.line {background-color: #99cccc; font-family: Georgia, serif; font-size: medium} + +/* Normal text */ +TD.n {font-family: Georgia, serif; font-size: smaller} + +/* Normal text monospaced */ +TD.msn {font-family: monospace; font-size: smaller} + +/* Added text */ +TD.a {background-color: #abd; font-family: Georgia, serif; font-size: smaller} + +/* Added text monospaced */ +TD.msa {background-color: #abd; font-family: monospace; font-size: smaller} + +/* Added file */ +TD.af {background-color: #abd} + +/* Added blank text */ +TD.ab {background-color: #cccccc; font-family: Georgia, serif; font-size: smaller} + +/* Added blank text monospaced */ +TD.msab {background-color: #cccccc; font-family: monospace; font-size: smaller} + +/* Removed text */ +TD.r {background-color: #ff9999; font-family: Georgia, serif; font-size: smaller} + +/* Removed text monospaced */ +TD.msr {background-color: #ff9999; font-family: monospace; font-size: smaller} + +/* Removed file */ +TD.rf {background-color: #ff9999} + +/* Removed blank text */ +TD.rb {background-color: #cccccc; font-family: Georgia, serif; font-size: smaller} + +/* Changed text */ +TD.c {background-color: #ffff77; font-family: Georgia, serif; font-size: smaller} + +/* Changed text monospaced */ +TD.msc {background-color: #ffff77; font-family: monospace; font-size: smaller} + +/* Changed file */ +TD.cf {background-color: #ffff77} + +/* Changed blank text */ +TD.cb {background-color: #eeee77; font-family: Georgia, serif; font-size: smaller} + +/* Changed blank text monospaced */ +TD.mscb {background-color: #eeee77; font-family: monospace; font-size: smaller} + +/* Line number with comment */ +SPAN.comment {color: #ff0000; font-family: Georgia, serif; font-size: smaller} + +/* Line number with no comment */ +SPAN.nocom {font-family: Georgia, serif; font-size: smaller} + +/* Monospaced line with added text */ +SPAN.msa {background-color: #abd; font-family: monospace; font-size: medium} + +/* Monospaced line with removed text */ +SPAN.msr {background-color: #ff9999; font-family: monospace; font-size: medium} + +/* Monospaced line with changed text */ +SPAN.msc {background-color: #ffff77; font-family: monospace; font-size: medium} + +/* Monospaced line with normal text */ +SPAN.ms {font-family: monospace; font-size: medium} + +/* Monospaced line number with comment */ +SPAN.mscom {color: #ff0000; font-family: monospace; font-size: medium} +/* Monospaced line number with no comment */ +SPAN.msnocom {font-family: monospace; font-size: medium} + +/* Smaller monospaced line number with comment */ +SPAN.smscom {color: #ff0000; font-family: monospace; font-size: smaller} + +/* Smaller monospaced line number with no comment */ +SPAN.smsnocom {font-family: monospace; font-size: smaller} + +/* File heading */ +SPAN.file_comment {background-color: #cccccc; font-family: Georgia, serif; font-size: medium; color: #ff0000} + +/* General heading */ +SPAN.general_comment {color: #ff0000} + +/* Style used for rendering data within popup window */ +PRE.ms {font-family: monospace; font-size: medium} + +/* Styles to use for topic list display */ + +/* Topic list heading */ +TR.tlh {background-color: #abd; font-family: Georgia, serif} + +/* Topic list row type 1 */ +TR.tl1 {background-color: #cccccc; font-family: Georgia, serif} + +/* Topic list row type 1 */ +TR.tl2 {background-color: #eeeeee; font-family: Georgia, serif} + +/* Colour to use for matching identifier */ +A.fid {color: #777777; text-decoration: none} + +/* Style comment listings. */ +TR.comments {background-color: #abd; font-family: Georgia, serif} /* space */ +TR.commenth {background-color: #cccccc; font-family: Georgia, serif} /* header */ +TR.commentb {background-color: #eeeeee; font-family: monospace} /* comment body */ +TD.commentb {background-color: #eeeeee; font-family: monospace} /* comment body */ +TR.commentc {background-color: #eeeeee; font-family: monospace} /* context */ + +/* Style for topic title headings. */ + +/* Topic title heading */ +TR.tth {background-color: #abd; font-family: Georgia, serif} +TD.tth {background-color: #abd; font-family: Georgia, serif} + +/* Topic title row type 0 */ +TR.tt0 {background-color: #cccccc; font-family: Georgia, serif} +TD.tt0 {background-color: #cccccc; font-family: Georgia, serif} + +/* Topic title row type 1 */ +TR.tt1 {background-color: #eeeeee; font-family: Georgia, serif} +TD.tt1 {background-color: #eeeeee; font-family: Georgia, serif} + +/* Codestriker heading */ +TD.heading {text-align: center; background-color: #246; font-family: Georgia, serif; font-size: x-large} +A.heading {text-decoration: none; color: #ffffff; background-color: transparent;} + +/* Codestriker top-level menu */ +DIV.menu {font-family: Georgia, serif} + +/* Tabbing styles */ +TR.tab {background-color: #abd; font-family: Georgia, serif} +TD.selected {background-color: #abd} +TD.notselected {background-color: #cccccc} +TD.space {background-color: #eeeeee} +A.tab {text-decoration: none} + +/* Styles for error field in comment posting tooltip. */ +span.hidden {display: none} +span.error {display: inline; color: red} + +span.feedback {color: red;} +span.obsolete-header {color: red; font-weight: bold;} + +/* Styles for highlight program. */ +SPAN.num { color:#0000ff; } +SPAN.esc { color:#000080; font-weight:bold; } +SPAN.str { color:#008000; font-weight:bold; } +SPAN.dstr { color:#008000; font-weight:bold; } +SPAN.slc { color:#008080; } +SPAN.com { color:#008080; } +SPAN.dir { color:#008200; } +SPAN.sym { color:#000000; } +SPAN.line { color:#555555; } +SPAN.mark { background-color:#ffffbb;} +SPAN.kwa { color:#000080; font-weight:bold; } +SPAN.kwb { color:#000080; font-weight:bold; } +SPAN.kwc { color:#000000; } +SPAN.kwd { color:#000000; } \ No newline at end of file Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.96 retrieving revision 1.97 diff -u -r1.96 -r1.97 --- codestriker.conf 21 Jun 2008 10:21:36 -0000 1.96 +++ codestriker.conf 21 Jun 2008 10:55:57 -0000 1.97 @@ -93,8 +93,11 @@ # If codestriker is installed differently to that described in the README file # (for example on the sourceforge servers), it may be necessary to explicitly -# specify the location of the codestriker_css as a URL. -$codestriker_css = ''; +# specify the location of the codestriker_css as a URL. This can also be +# used for specifying a different CSS file to use, for example, +# codestriker-bluish.css which is a part of the codestriker distribution. +$codestriker_css = 'codestriker.css'; +#$codestriker_css = 'codestriker-bluish.css'; # Valid repositories which may be selected at the create topic screen. # The order shown here is the order presented in the option list. Most |
From: <si...@us...> - 2008-07-01 23:09:11
|
User: sits Date: 08/07/01 16:09:10 Modified: . codestriker.conf Log: Make sorting of topic filenames the default Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.99 retrieving revision 1.100 diff -u -r1.99 -r1.100 --- codestriker.conf 26 Jun 2008 21:52:23 -0000 1.99 +++ codestriker.conf 1 Jul 2008 23:09:10 -0000 1.100 @@ -348,10 +348,10 @@ # Indicate whether the diffs presented in a topic should be ordered by # filename. For some deployments, it is important that the order of the -# diffs are presented in the same order as it was in the file. For other -# deployments, apparently Subversion can returns diffs in an arbitrary -# order, so setting this to '1' would be useful. -$sort_diffs_by_filename = 0; +# diffs are presented in the same order as it was in the file. Subversion +# reports diffs I believe in order of modification, which makes it +# quite arbitrary, so the default is to sort. +$sort_diffs_by_filename = 1; # Bug database to update. Currently, Bugzilla, Flyspray and TestDirector # are supported, but it is straight-forward to support other bug |
From: <si...@us...> - 2008-09-06 00:31:54
|
User: sits Date: 08/09/05 17:31:51 Modified: lib/Codestriker/FileParser PerforceDiff.pm PatchUnidiff.pm ClearCaseSerialDiff.pm SubversionDiff.pm Parser.pm BasicDiffUtils.pm PerforceDescribe.pm UnidiffUtils.pm UnknownFormat.pm CvsUnidiff.pm PatchBasicDiff.pm VssDiff.pm lib/Codestriker/Http/Method AddProjectMethod.pm SearchTopicsMethod.pm ViewTopicCommentsMethod.pm DownloadTopicTextMethod.pm AddTopicMethod.pm UpdateTopicMetricsMethod.pm ViewTopicMetricsMethod.pm UpdateTopicPropertiesMethod.pm ViewTopicFileMethod.pm ViewTopicTextMethod.pm UpdateCommentMetricsMethod.pm SubmitSearchTopicsMethod.pm DownloadMetricsMethod.pm ViewMetricsMethod.pm ViewTopicPropertiesMethod.pm ListProjectsMethod.pm EditProjectMethod.pm CreateCommentMethod.pm ListTopicsMethod.pm StaticResourcesMethod.pm CreateTopicMethod.pm UpdateTopicStateMethod.pm AddCommentMethod.pm CreateProjectMethod.pm UpdateProjectMethod.pm lib/Codestriker/Action MetricsReport.pm ViewTopicComments.pm SubmitNewComment.pm ListTopicsRSS.pm SubmitSearch.pm CreateProject.pm SubmitEditCommentsState.pm SubmitEditTopicMetrics.pm ListTopics.pm EditProject.pm ViewTopicInfo.pm ViewTopic.pm CreateTopic.pm ListProjects.pm SubmitEditTopicsState.pm SubmitEditTopicProperties.pm DownloadTopic.pm SubmitEditProject.pm ViewTopicFile.pm SubmitNewTopic.pm ViewTopicProperties.pm Search.pm EditComment.pm SubmitNewProject.pm lib/Codestriker/Http NonHighlightedLxrLineFilter.pm UrlBuilder.pm LineFilter.pm Response.pm Cookie.pm Template.pm LxrLineFilter.pm Dispatcher.pm TabToNbspLineFilter.pm HighlightLineFilter.pm Input.pm HtmlEntityLineFilter.pm DeltaRenderer.pm HighlightedLxrLineFilter.pm Method.pm lib/Codestriker/Repository RepositoryFactory.pm CvsWeb.pm ScmBug.pm ClearCaseSnapshot.pm Perforce.pm Subversion.pm ViewCvs.pm ClearCaseDynamic.pm Cvs.pm Vss.pm lib/Codestriker/DB SQLite.pm PostgreSQL.pm Column.pm DBI.pm MySQL.pm ODBC.pm Oracle.pm Database.pm Table.pm lib/Codestriker/Model Delta.pm MetricStats.pm Metrics.pm File.pm Topic.pm Project.pm Comment.pm lib Codestriker.pm lib/Codestriker/BugDB FlysprayConnection.pm BugzillaConnection.pm BugDBConnectionFactory.pm TestDirectorConnection.pm bin codestriker.pl.base install.pl lib/Codestriker/TopicListeners HistoryRecorder.pm Manager.pm Email.pm BugTracking.pm TopicListener.pm . codestriker.conf Log: Whitespace changes primarily - reverting bck to emacs's cperl-mode, and replaced all tabs with spaces. Index: PerforceDiff.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/FileParser/PerforceDiff.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- PerforceDiff.pm 22 May 2005 22:26:04 -0000 1.2 +++ PerforceDiff.pm 6 Sep 2008 00:31:44 -0000 1.3 @@ -29,7 +29,7 @@ # Skip initial whitespace. my $line = <$fh>; while (defined($line) && $line =~ /^\s*$/) { - $line = <$fh>; + $line = <$fh>; } # Array of results found. @@ -41,67 +41,65 @@ # Now read the actual diff chunks. while (defined($line)) { - if ($line =~ /^==== (.*)\#(\d+) \- .* ==== \((.*)\)$/) { - my $filename = $1; - my $revision = $2; - my $file_type = $3; - - if ($file_type eq "ubinary" || $file_type eq "xbinary" || - $file_type eq "binary") { - # Binary file, skip the next line and add the record in. - $line = <$fh>; - my $chunk = {}; - $chunk->{filename} = $filename; - $chunk->{revision} = $revision; - $chunk->{old_linenumber} = -1; - $chunk->{new_linenumber} = -1; - $chunk->{binary} = 1; - $chunk->{text} = ""; - $chunk->{description} = ""; - $chunk->{repmatch} = $repmatch; - push @result, $chunk; - } - elsif ($file_type eq "text") { - # Note there may be an optional '---' and '+++' lines - # before the chunk. - my $lastpos = tell $fh; - if (<$fh> !~ /^\-\-\-/ || <$fh> !~ /^\+\+\+/) { - # Move the file pointer back. - seek $fh, $lastpos, 0; - } - - my @file_diffs = Codestriker::FileParser::UnidiffUtils-> - read_unidiff_text($fh, $filename, $revision, $repmatch); - push @result, @file_diffs; - } - else { - # Got knows what this is, can't parse it. - return (); - } - } elsif ($line =~ /^==== (.*)\#(\d+) \-/) { - my $filename = $1; - my $revision = $2; - - # Now read the entire diff chunk (it may be empty if the - # user hasn't actually modified the file). Note there - # may be an optional '---' and '+++' lines before the - # chunk. - my $lastpos = tell $fh; - if (<$fh> !~ /^\-\-\-/ || <$fh> !~ /^\+\+\+/) { - # Move the file pointer back. - seek $fh, $lastpos, 0; - } - - my @file_diffs = Codestriker::FileParser::UnidiffUtils-> - read_unidiff_text($fh, $filename, $revision, $repmatch); - push @result, @file_diffs; - } else { - # Can't parse this file. - return (); - } - - # Now read the next chunk. - $line = <$fh> if defined $line; + if ($line =~ /^==== (.*)\#(\d+) \- .* ==== \((.*)\)$/) { + my $filename = $1; + my $revision = $2; + my $file_type = $3; + + if ($file_type eq "ubinary" || $file_type eq "xbinary" || + $file_type eq "binary") { + # Binary file, skip the next line and add the record in. + $line = <$fh>; + my $chunk = {}; + $chunk->{filename} = $filename; + $chunk->{revision} = $revision; + $chunk->{old_linenumber} = -1; + $chunk->{new_linenumber} = -1; + $chunk->{binary} = 1; + $chunk->{text} = ""; + $chunk->{description} = ""; + $chunk->{repmatch} = $repmatch; + push @result, $chunk; + } elsif ($file_type eq "text") { + # Note there may be an optional '---' and '+++' lines + # before the chunk. + my $lastpos = tell $fh; + if (<$fh> !~ /^\-\-\-/ || <$fh> !~ /^\+\+\+/) { + # Move the file pointer back. + seek $fh, $lastpos, 0; + } + + my @file_diffs = Codestriker::FileParser::UnidiffUtils-> + read_unidiff_text($fh, $filename, $revision, $repmatch); + push @result, @file_diffs; + } else { + # Got knows what this is, can't parse it. + return (); + } + } elsif ($line =~ /^==== (.*)\#(\d+) \-/) { + my $filename = $1; + my $revision = $2; + + # Now read the entire diff chunk (it may be empty if the + # user hasn't actually modified the file). Note there + # may be an optional '---' and '+++' lines before the + # chunk. + my $lastpos = tell $fh; + if (<$fh> !~ /^\-\-\-/ || <$fh> !~ /^\+\+\+/) { + # Move the file pointer back. + seek $fh, $lastpos, 0; + } + + my @file_diffs = Codestriker::FileParser::UnidiffUtils-> + read_unidiff_text($fh, $filename, $revision, $repmatch); + push @result, @file_diffs; + } else { + # Can't parse this file. + return (); + } + + # Now read the next chunk. + $line = <$fh> if defined $line; } # Return the found diff chunks. Index: PatchUnidiff.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/FileParser/PatchUnidiff.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- PatchUnidiff.pm 14 Jul 2008 05:35:59 -0000 1.7 +++ PatchUnidiff.pm 6 Sep 2008 00:31:44 -0000 1.8 @@ -25,91 +25,91 @@ my $line = <$fh>; while (defined($line)) { - # Values associated with the diff. - my $revision = $Codestriker::PATCH_REVISION; - my $filename = ""; - my $old_linenumber = -1; - my $new_linenumber = -1; - my $binary = 0; - - # Skip any heading or trailing whitespace contained in the review - # text. - while (defined($line) && $line =~ /^\s*$/) { - $line = <$fh>; - } - return @result unless defined $line; - - # For unidiffs, the diff line may appear first, but is optional, - # depending on how the diff was generated. In any case, the line - # is ignored. - if (defined $line && $line =~ /^diff/o) { - $line = <$fh>; - } - return () unless defined $line; - - # Git patches might have an index: line, such as: - # index b3fc290..d13313f 100644 - if ($line =~ /^index /o) { - $line = <$fh>; - } - return () unless defined $line; - + # Values associated with the diff. + my $revision = $Codestriker::PATCH_REVISION; + my $filename = ""; + my $old_linenumber = -1; + my $new_linenumber = -1; + my $binary = 0; + + # Skip any heading or trailing whitespace contained in the review + # text. + while (defined($line) && $line =~ /^\s*$/) { + $line = <$fh>; + } + return @result unless defined $line; + + # For unidiffs, the diff line may appear first, but is optional, + # depending on how the diff was generated. In any case, the line + # is ignored. + if (defined $line && $line =~ /^diff/o) { + $line = <$fh>; + } + return () unless defined $line; + + # Git patches might have an index: line, such as: + # index b3fc290..d13313f 100644 + if ($line =~ /^index /o) { + $line = <$fh>; + } + return () unless defined $line; + # Need to check for binary file differences. # Unfortunately, when you provide the "-N" argument to diff, # it doesn't indicate new files or removed files properly. Without # the -N argument, it then indicates "Only in ...". if ($line =~ /^Binary files .* and (.*) differ$/ || - $line =~ /^Files .* and (.*) differ$/) { + $line =~ /^Files .* and (.*) differ$/) { $filename = $1; $binary = 1; } elsif ($line =~ /^Only in (.*): (.*)$/) { $filename = "$1/$2"; $binary = 1; - } elsif ($line =~ /^\-\-\- \/dev\/null/o) { - # File has been added. - $revision = $Codestriker::ADDED_REVISION; - } elsif ($line =~ /^\-\-\- ([^\t\n]+)/o) { - # Note git and quilt diffs don't have a tab character unlike normal diffs. - $filename = $1; - } else { - return (); - } - - if ($binary == 0) { - # Now expect the +++ line. - $line = <$fh>; - return () unless defined $line; - - # Check if it is a removed file. - if ($line =~ /^\+\+\+ \/dev\/null/o) { - # File has been removed. - $revision = $Codestriker::REMOVED_REVISION; - } elsif ($line =~ /^\+\+\+ ([^\t\n]+)/o) { - $filename = $1; - } else { - return (); - } - - # Extract the diff chunks for this file. - my @file_diffs = Codestriker::FileParser::UnidiffUtils-> - read_unidiff_text($fh, $filename, $revision, 0); - push @result, @file_diffs; - } else { - my $chunk = {}; - $chunk->{filename} = $filename; - $chunk->{revision} = $revision; - $chunk->{old_linenumber} = -1; - $chunk->{new_linenumber} = -1; - $chunk->{binary} = 1; - $chunk->{text} = ""; - $chunk->{description} = ""; - $chunk->{repmatch} = 0; - push @result, $chunk; - } + } elsif ($line =~ /^\-\-\- \/dev\/null/o) { + # File has been added. + $revision = $Codestriker::ADDED_REVISION; + } elsif ($line =~ /^\-\-\- ([^\t\n]+)/o) { + # Note git and quilt diffs don't have a tab character unlike normal diffs. + $filename = $1; + } else { + return (); + } + + if ($binary == 0) { + # Now expect the +++ line. + $line = <$fh>; + return () unless defined $line; + + # Check if it is a removed file. + if ($line =~ /^\+\+\+ \/dev\/null/o) { + # File has been removed. + $revision = $Codestriker::REMOVED_REVISION; + } elsif ($line =~ /^\+\+\+ ([^\t\n]+)/o) { + $filename = $1; + } else { + return (); + } + + # Extract the diff chunks for this file. + my @file_diffs = Codestriker::FileParser::UnidiffUtils-> + read_unidiff_text($fh, $filename, $revision, 0); + push @result, @file_diffs; + } else { + my $chunk = {}; + $chunk->{filename} = $filename; + $chunk->{revision} = $revision; + $chunk->{old_linenumber} = -1; + $chunk->{new_linenumber} = -1; + $chunk->{binary} = 1; + $chunk->{text} = ""; + $chunk->{description} = ""; + $chunk->{repmatch} = 0; + push @result, $chunk; + } - # Read the next line. - $line = <$fh>; + # Read the next line. + $line = <$fh>; } # Return the found diff chunks. @@ -118,4 +118,4 @@ 1; - + Index: ClearCaseSerialDiff.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/FileParser/ClearCaseSerialDiff.pm,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ClearCaseSerialDiff.pm 24 Sep 2007 21:25:45 -0000 1.5 +++ ClearCaseSerialDiff.pm 6 Sep 2008 00:31:44 -0000 1.6 @@ -21,7 +21,7 @@ # Retrieve the repository root, and escape back-slashes in the case of # a Windows CVS repository, as it is used in regular expressions. my $repository_root = - (defined $repository) ? $repository->getRoot() : undef; + (defined $repository) ? $repository->getRoot() : undef; if (defined $repository_root) { $repository_root =~ s/\\/\\\\/g; } @@ -37,128 +37,126 @@ # Ignore any whitespace at the start of the file. my $line = <$fh>; while (defined($line)) { - # Skip any heading or trailing whitespace contained in the review - # text, in addition to the "Files/Directories are identical" lines, - # which happen due to the way review texts are generated. - while (defined($line) && - ($line =~ /^\s*$/o || - $line =~ /^Files are identical$/o || - $line =~ /^Directories are identical$/o)) { - $line = <$fh>; - } - return @result unless defined $line; - - # Check if the next fileheader is being read. - if (defined $line && - $line =~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o) { - - # Now read the file/directory that has been modified. - $line = <$fh>; - return () unless defined $line; - - if ($line =~ /^\<\<\< file 1\: (.*)\@\@(.*)$/o) { - $filename = $1; - $revision = $2; - - # Check if the filename matches the clear case repository. - # This is very simple for now, but will need to be more - # sophisticated later. - if (defined $repository_root && - $filename =~ /^$repository_root[\/\\](.*)$/o) { - $filename = $1; - $repmatch = 1; - } else { - $repmatch = 0; - } - - # Read the next line which is the local file. - $line = <$fh>; - return () unless - defined $line && $line =~ /^\>\>\> file 2\: .*$/o; - - # Now expect the end of the file header. - $line = <$fh>; - return () unless - defined $line && $line =~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o; - - # Read the next line. - $line = <$fh>; - return () unless defined $line; - } - elsif ($line =~ /^\<\<\< directory 1\: (.*)\@\@(.*)$/o) { - # Currently we don't really support directory - # operations. ClearCase captures added/deleted - # sub-directories and deleted files as a directory change, - # but unfortunately added files go straight into the - # VOB - great. Try to fddge this so that we treat the - # directory as a file, where the contents are the diff - # file itself - better than nothing, and the reviewers - # can at least see what is going on. - $filename = $1; - $revision = $2; - - # Check if the filename matches the clear case repository. - # This is very simple for now, but will need to be more - # sophisticated later. - if (defined $repository_root && - $filename =~ /^$repository_root[\/\\](.*)$/o) { - $filename = $1; - } - - # Read the next line which is the local directory. - $line = <$fh>; - return () unless - defined $line && $line =~ /^\>\>\> directory 2\: .*$/o; - - # Now expect the end of the file header. - $line = <$fh>; - return () unless - defined $line && $line =~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o; - - # Keep reading text until there is nothing left for this - # segment. - my $text = ""; - $line = <$fh>; - while (defined $line && - $line !~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o) { - if ($line !~ /^Files are identical$/o && - $line !~ /^Directories are identical$/o) { - $text .= "+$line"; - } - $line = <$fh>; - } - - # Create the chunk, indicating there is not a repository match, - # since this is for a directory entry with some basic text. - my $chunk = {}; - $chunk->{filename} = $filename; - $chunk->{revision} = $revision; - $chunk->{old_linenumber} = 0; - $chunk->{new_linenumber} = 1; - $chunk->{binary} = 0; - $chunk->{text} = $text; - $chunk->{description} = ""; - $chunk->{repmatch} = 0; - push @result, $chunk; - - # Process the next block. - next; - } - else { - # Some unknown format. - return (); - } - } - - # Read the next diff chunk. - my $chunk = - Codestriker::FileParser::BasicDiffUtils->read_diff_text( - $fh, $line, $filename, $revision, $repmatch); - return () unless defined $chunk; - push @result, $chunk; + # Skip any heading or trailing whitespace contained in the review + # text, in addition to the "Files/Directories are identical" lines, + # which happen due to the way review texts are generated. + while (defined($line) && + ($line =~ /^\s*$/o || + $line =~ /^Files are identical$/o || + $line =~ /^Directories are identical$/o)) { + $line = <$fh>; + } + return @result unless defined $line; + + # Check if the next fileheader is being read. + if (defined $line && + $line =~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o) { + + # Now read the file/directory that has been modified. + $line = <$fh>; + return () unless defined $line; + + if ($line =~ /^\<\<\< file 1\: (.*)\@\@(.*)$/o) { + $filename = $1; + $revision = $2; + + # Check if the filename matches the clear case repository. + # This is very simple for now, but will need to be more + # sophisticated later. + if (defined $repository_root && + $filename =~ /^$repository_root[\/\\](.*)$/o) { + $filename = $1; + $repmatch = 1; + } else { + $repmatch = 0; + } + + # Read the next line which is the local file. + $line = <$fh>; + return () unless + defined $line && $line =~ /^\>\>\> file 2\: .*$/o; + + # Now expect the end of the file header. + $line = <$fh>; + return () unless + defined $line && $line =~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o; + + # Read the next line. + $line = <$fh>; + return () unless defined $line; + } elsif ($line =~ /^\<\<\< directory 1\: (.*)\@\@(.*)$/o) { + # Currently we don't really support directory + # operations. ClearCase captures added/deleted + # sub-directories and deleted files as a directory change, + # but unfortunately added files go straight into the + # VOB - great. Try to fddge this so that we treat the + # directory as a file, where the contents are the diff + # file itself - better than nothing, and the reviewers + # can at least see what is going on. + $filename = $1; + $revision = $2; + + # Check if the filename matches the clear case repository. + # This is very simple for now, but will need to be more + # sophisticated later. + if (defined $repository_root && + $filename =~ /^$repository_root[\/\\](.*)$/o) { + $filename = $1; + } + + # Read the next line which is the local directory. + $line = <$fh>; + return () unless + defined $line && $line =~ /^\>\>\> directory 2\: .*$/o; + + # Now expect the end of the file header. + $line = <$fh>; + return () unless + defined $line && $line =~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o; + + # Keep reading text until there is nothing left for this + # segment. + my $text = ""; + $line = <$fh>; + while (defined $line && + $line !~ /^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*$/o) { + if ($line !~ /^Files are identical$/o && + $line !~ /^Directories are identical$/o) { + $text .= "+$line"; + } + $line = <$fh>; + } + + # Create the chunk, indicating there is not a repository match, + # since this is for a directory entry with some basic text. + my $chunk = {}; + $chunk->{filename} = $filename; + $chunk->{revision} = $revision; + $chunk->{old_linenumber} = 0; + $chunk->{new_linenumber} = 1; + $chunk->{binary} = 0; + $chunk->{text} = $text; + $chunk->{description} = ""; + $chunk->{repmatch} = 0; + push @result, $chunk; + + # Process the next block. + next; + } else { + # Some unknown format. + return (); + } + } + + # Read the next diff chunk. + my $chunk = + Codestriker::FileParser::BasicDiffUtils->read_diff_text( + $fh, $line, $filename, $revision, $repmatch); + return () unless defined $chunk; + push @result, $chunk; - # Read the next line. - $line = <$fh>; + # Read the next line. + $line = <$fh>; } # Return the found diff chunks. @@ -167,4 +165,4 @@ 1; - + Index: SubversionDiff.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/FileParser/SubversionDiff.pm,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- SubversionDiff.pm 2 Sep 2008 06:33:57 -0000 1.11 +++ SubversionDiff.pm 6 Sep 2008 00:31:44 -0000 1.12 @@ -24,137 +24,137 @@ my $line = <$fh>; while (defined($line)) { - # Values associated with the diff. - my $entry_type; - my $revision; - my $filename = ""; - my $old_linenumber = -1; - my $new_linenumber = -1; - my $binary = 0; - my $diff = ""; - - # Skip whitespace. - while (defined($line) && $line =~ /^\s*$/o) { - $line = <$fh>; - } - return @result unless defined $line; - - # For SVN diffs, the start of the diff block is the Index line. - # For SVN look diffs, the start of the diff block contains the change type. - # Also check for presence of property set blocks. - while ($line =~ /^.*Property changes on: .*$/o) { - $line = <$fh>; - return () unless defined $line && - $line =~ /^___________________________________________________________________$/o; - - # Keep reading until we either get to the separator line or end of file. - while (defined $line && - $line !~ /^===================================================================$/o) { - if ($line =~ /^.*(Index|Added|Modified|Copied|Deleted): (.*)$/o) { - $entry_type = $1; - $filename = $2; + # Values associated with the diff. + my $entry_type; + my $revision; + my $filename = ""; + my $old_linenumber = -1; + my $new_linenumber = -1; + my $binary = 0; + my $diff = ""; + + # Skip whitespace. + while (defined($line) && $line =~ /^\s*$/o) { + $line = <$fh>; + } + return @result unless defined $line; + + # For SVN diffs, the start of the diff block is the Index line. + # For SVN look diffs, the start of the diff block contains the change type. + # Also check for presence of property set blocks. + while ($line =~ /^.*Property changes on: .*$/o) { + $line = <$fh>; + return () unless defined $line && + $line =~ /^___________________________________________________________________$/o; + + # Keep reading until we either get to the separator line or end of file. + while (defined $line && + $line !~ /^===================================================================$/o) { + if ($line =~ /^.*(Index|Added|Modified|Copied|Deleted): (.*)$/o) { + $entry_type = $1; + $filename = $2; + } + $line = <$fh>; + } + + if (!defined $line) { + # End of file has been reached, return what we have parsed. + return @result; } - $line = <$fh>; } - - if (!defined $line) { - # End of file has been reached, return what we have parsed. - return @result; + + if ($line =~ /^.*(Index|Added|Modified|Copied|Deleted): (.*)$/o) { + $entry_type = $1; + $filename = $2; + $line = <$fh>; } - } - if ($line =~ /^.*(Index|Added|Modified|Copied|Deleted): (.*)$/o) { - $entry_type = $1; - $filename = $2; - $line = <$fh>; - } + # The separator line appears next. + return () unless defined $line && $line =~ /^===================================================================$/o; + $line = <$fh>; + + # Check if this is a file entry with no content. If so, skip it. + next if ! defined $line || $line =~ /^\s*$/o; + + # Check if the delta represents a binary file. + if ($line =~ /^Cannot display: file marked as a binary type\./o || + $line =~ /^\(Binary files differ\)/o) { + + # If it is a new binary file, there will be some lines before + # the next Index: line, or end of file. In other cases, it is + # impossible to know whether the file is being modified or + # removed, and what revision it is based off. + $line = <$fh>; + my $count = 0; + while (defined $line && $line !~ /^Index|Added|Modified|Deleted|Property changes on:/o) { + $line = <$fh>; + $count++; + } + + my $chunk = {}; + $chunk->{filename} = $filename; + if ($entry_type eq "Index") { + $chunk->{revision} = $count > 0 ? $Codestriker::ADDED_REVISION : + $Codestriker::PATCH_REVISION; + } elsif ($entry_type eq "Added") { + $chunk->{revision} = $Codestriker::ADDED_REVISION; + } elsif ($entry_type eq "Deleted") { + $chunk->{revision} = $Codestriker::REMOVED_REVISION; + } else { + $chunk->{revision} = $Codestriker::PATCH_REVISION; + } + $chunk->{old_linenumber} = -1; + $chunk->{new_linenumber} = -1; + $chunk->{binary} = 1; + $chunk->{text} = ""; + $chunk->{description} = ""; + $chunk->{repmatch} = 1; + push @result, $chunk; + } else { + # Try and read the base revision this change is against, + # while handling new and removed files. + my $base_revision = -1; + if ($line =~ /^\-\-\- .*\s.*\(.*?(\d+)\)/io) { + $base_revision = $1; + } elsif ($line !~ /^\-\-\- .*/io) { + return (); + } - # The separator line appears next. - return () unless defined $line && $line =~ /^===================================================================$/o; - $line = <$fh>; - - # Check if this is a file entry with no content. If so, skip it. - next if ! defined $line || $line =~ /^\s*$/o; - - # Check if the delta represents a binary file. - if ($line =~ /^Cannot display: file marked as a binary type\./o || - $line =~ /^\(Binary files differ\)/o) { - - # If it is a new binary file, there will be some lines before - # the next Index: line, or end of file. In other cases, it is - # impossible to know whether the file is being modified or - # removed, and what revision it is based off. - $line = <$fh>; - my $count = 0; - while (defined $line && $line !~ /^Index|Added|Modified|Deleted|Property changes on:/o) { - $line = <$fh>; - $count++; - } - - my $chunk = {}; - $chunk->{filename} = $filename; - if ($entry_type eq "Index") { - $chunk->{revision} = $count > 0 ? $Codestriker::ADDED_REVISION : - $Codestriker::PATCH_REVISION; - } elsif ($entry_type eq "Added") { - $chunk->{revision} = $Codestriker::ADDED_REVISION; - } elsif ($entry_type eq "Deleted") { - $chunk->{revision} = $Codestriker::REMOVED_REVISION; - } else { - $chunk->{revision} = $Codestriker::PATCH_REVISION; - } - $chunk->{old_linenumber} = -1; - $chunk->{new_linenumber} = -1; - $chunk->{binary} = 1; - $chunk->{text} = ""; - $chunk->{description} = ""; - $chunk->{repmatch} = 1; - push @result, $chunk; - } else { - # Try and read the base revision this change is against, - # while handling new and removed files. - my $base_revision = -1; - if ($line =~ /^\-\-\- .*\s.*\(.*?(\d+)\)/io) { - $base_revision = $1; - } elsif ($line !~ /^\-\-\- .*/io) { - return (); - } - - # Make sure the +++ line is present next. - $line = <$fh>; - return () unless defined $line; - if ($line !~ /^\+\+\+ .*/io) { - return (); - } - - # Now parse the unidiff chunks. - my @file_diffs = Codestriker::FileParser::UnidiffUtils-> - read_unidiff_text($fh, $filename, $base_revision, 1); - - # If $base_revision is -1, and old_linenumber is 0, then - # the file is added. If $base_revision is -1, and - # new_linenumber is 0, then the file is removed. Update - # any chunks to indicate this. - if ($base_revision == -1) { - for (my $i = 0; $i <= $#file_diffs; $i++) { - my $delta = $file_diffs[$i]; - if ($delta->{old_linenumber} == 0) { - $delta->{revision} = $Codestriker::ADDED_REVISION; - } elsif ($delta->{new_linenumber} == 0) { - $delta->{revision} = $Codestriker::REMOVED_REVISION; - } - } - } - - push @result, @file_diffs; - - # Read the next line. - $line = <$fh>; - } + # Make sure the +++ line is present next. + $line = <$fh>; + return () unless defined $line; + if ($line !~ /^\+\+\+ .*/io) { + return (); + } + + # Now parse the unidiff chunks. + my @file_diffs = Codestriker::FileParser::UnidiffUtils-> + read_unidiff_text($fh, $filename, $base_revision, 1); + + # If $base_revision is -1, and old_linenumber is 0, then + # the file is added. If $base_revision is -1, and + # new_linenumber is 0, then the file is removed. Update + # any chunks to indicate this. + if ($base_revision == -1) { + for (my $i = 0; $i <= $#file_diffs; $i++) { + my $delta = $file_diffs[$i]; + if ($delta->{old_linenumber} == 0) { + $delta->{revision} = $Codestriker::ADDED_REVISION; + } elsif ($delta->{new_linenumber} == 0) { + $delta->{revision} = $Codestriker::REMOVED_REVISION; + } + } + } + + push @result, @file_diffs; + + # Read the next line. + $line = <$fh>; + } } # Return the found diff chunks. return @result; } - + 1; Index: Parser.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/FileParser/Parser.pm,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- Parser.pm 26 Jun 2008 21:52:23 -0000 1.25 +++ Parser.pm 6 Sep 2008 00:31:44 -0000 1.26 @@ -7,7 +7,7 @@ # the terms of the GPL. # Main delegate parser object, which tries a bunch of parsers to determine what -# format the input review is in. The last resort, is to view it as +# format the input review is in. The last resort, is to view it as # unstructured text, if it is content-type plain/text, otherwise indicate # an error. @@ -32,7 +32,7 @@ # lines, revisions and diffs have been submitted in this review. sub parse ($$$$$$) { my ($type, $fh, $content_type, $repository, $topicid, - $uploaded_filename) = @_; + $uploaded_filename) = @_; # Diffs found. my @diffs = (); @@ -45,139 +45,138 @@ # once this function has finished. my $tmpfh; if (defined $Codestriker::tmpdir && $Codestriker::tmpdir ne "") { - $tmpfh = tempfile(DIR => $Codestriker::tmpdir); - } - else { - $tmpfh = tempfile(); + $tmpfh = tempfile(DIR => $Codestriker::tmpdir); + } else { + $tmpfh = tempfile(); } binmode $tmpfh, ':utf8'; - + if (!$tmpfh) { - die "Unable to create temporary parse file: $!"; + die "Unable to create temporary parse file: $!"; } binmode $fh; my $first_line = 1; while (<$fh>) { - if ($first_line) { - # Remove the UTF8 BOM if it exists. - s/^\xEF\xBB\xBF//o; - $first_line = 0; - } - my $line = Codestriker::decode_topic_text($_); - $line =~ s/\r\n/\n/go; - print $tmpfh $line; + if ($first_line) { + # Remove the UTF8 BOM if it exists. + s/^\xEF\xBB\xBF//o; + $first_line = 0; + } + my $line = Codestriker::decode_topic_text($_); + $line =~ s/\r\n/\n/go; + print $tmpfh $line; } # Rewind the file, then let the parsers have at it. seek($tmpfh,0,0) || - die "Unable to seek to the start of the temporary file: $!"; + die "Unable to seek to the start of the temporary file: $!"; # If the file is plain/text, try all of the text parsers. if ($content_type eq "text/plain") { - # Check if it is a CVS unidiff file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::CvsUnidiff->parse($tmpfh, - $repository); - } - - # Check if it is a Subversion diff file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::SubversionDiff->parse($tmpfh, - $repository); - } - - # Check if it is a Perforce describe file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::PerforceDescribe->parse($tmpfh, - $repository); - } - - # Check if it is a Perforce diff file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::PerforceDiff->parse($tmpfh, - $repository); - } - - # Check if it is a VSS diff file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::VssDiff->parse($tmpfh, - $repository); - } - - # Check if it is a patch unidiff file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::PatchUnidiff->parse($tmpfh, - $repository); - } - - # Check if it is a patch basic file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::PatchBasicDiff->parse($tmpfh, - $uploaded_filename); - } - - # Check if it is a ClearCase serial diff file. - if ($#diffs == -1) { - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = - Codestriker::FileParser::ClearCaseSerialDiff->parse($tmpfh, - $repository); - } - - # Last stop-gap - the file format is unknown, treat it as a - # single file with filename "unknown". - if ($#diffs == -1) { - if (! defined $uploaded_filename || $uploaded_filename eq '') { - $uploaded_filename = 'unknown.txt'; - } - seek($tmpfh, 0, 0) || - die "Unable to seek to the start of the temporary file: $!"; - @diffs = Codestriker::FileParser::UnknownFormat-> - parse($tmpfh, $uploaded_filename); - } + # Check if it is a CVS unidiff file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::CvsUnidiff->parse($tmpfh, + $repository); + } + + # Check if it is a Subversion diff file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::SubversionDiff->parse($tmpfh, + $repository); + } + + # Check if it is a Perforce describe file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::PerforceDescribe->parse($tmpfh, + $repository); + } + + # Check if it is a Perforce diff file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::PerforceDiff->parse($tmpfh, + $repository); + } + + # Check if it is a VSS diff file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::VssDiff->parse($tmpfh, + $repository); + } + + # Check if it is a patch unidiff file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::PatchUnidiff->parse($tmpfh, + $repository); + } + + # Check if it is a patch basic file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::PatchBasicDiff->parse($tmpfh, + $uploaded_filename); + } + + # Check if it is a ClearCase serial diff file. + if ($#diffs == -1) { + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = + Codestriker::FileParser::ClearCaseSerialDiff->parse($tmpfh, + $repository); + } + + # Last stop-gap - the file format is unknown, treat it as a + # single file with filename "unknown". + if ($#diffs == -1) { + if (! defined $uploaded_filename || $uploaded_filename eq '') { + $uploaded_filename = 'unknown.txt'; + } + seek($tmpfh, 0, 0) || + die "Unable to seek to the start of the temporary file: $!"; + @diffs = Codestriker::FileParser::UnknownFormat-> + parse($tmpfh, $uploaded_filename); + } } elsif ($content_type eq "application/gzip" || - $content_type eq "application/x-gzip") { - # Check if it is a gzip file. + $content_type eq "application/x-gzip") { + # Check if it is a gzip file. } elsif ($content_type eq "application/zip" || - $content_type eq "application/x-zip") { - # Check if it is a zip file. + $content_type eq "application/x-zip") { + # Check if it is a zip file. } # Restore the offset back to the start of the file again. seek($fh, 0, 0) || - die "Unable to seek to the start of the temporary file. $!"; + die "Unable to seek to the start of the temporary file. $!"; - if (defined $Codestriker::sort_diffs_by_filename && - $Codestriker::sort_diffs_by_filename) { - # Sort the diff chunks by filename, then old linenumber. - @diffs = sort { $a->{filename} cmp $b->{filename} || - $a->{old_linenumber} <=> $b->{old_linenumber} } @diffs; - } + if (defined $Codestriker::sort_diffs_by_filename && + $Codestriker::sort_diffs_by_filename) { + # Sort the diff chunks by filename, then old linenumber. + @diffs = sort { $a->{filename} cmp $b->{filename} || + $a->{old_linenumber} <=> $b->{old_linenumber} } @diffs; + } # Only include those files whose extension is not in # @Codestriker::exclude_file_types, provided it is defined. @@ -185,16 +184,16 @@ my @trimmed_diffs = (); foreach my $curr (@diffs) { - if ($curr->{filename} =~ /\.([^\.]+)(,v)?$/o) { - my $ext = $1; - push @trimmed_diffs, $curr - unless grep { $_ eq $ext } @Codestriker::exclude_file_types; - } else { - # No extension on this file, add the diff in. - push @trimmed_diffs, $curr; - } + if ($curr->{filename} =~ /\.([^\.]+)(,v)?$/o) { + my $ext = $1; + push @trimmed_diffs, $curr + unless grep { $_ eq $ext } @Codestriker::exclude_file_types; + } else { + # No extension on this file, add the diff in. + push @trimmed_diffs, $curr; + } } - + # Return the diffs found, if any. return @trimmed_diffs; } Index: BasicDiffUtils.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/FileParser/BasicDiffUtils.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- BasicDiffUtils.pm 15 Nov 2004 10:44:06 -0000 1.4 +++ BasicDiffUtils.pm 6 Sep 2008 00:31:44 -0000 1.5 @@ -26,106 +26,106 @@ my $new_length = 0; if ($line =~ /^(\d+)a(\d+),(\d+)$/o || - $line =~ /^\-\-\-\-\-\[after (\d+) inserted(?:\/moved)? (\d+)\-(\d+)(?: \(was at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { - # Added multiple lines of text. - $old_linenumber = $1+1; - $new_linenumber = $2; - $new_length = $3 - $2 + 1; + $line =~ /^\-\-\-\-\-\[after (\d+) inserted(?:\/moved)? (\d+)\-(\d+)(?: \(was at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { + # Added multiple lines of text. + $old_linenumber = $1+1; + $new_linenumber = $2; + $new_length = $3 - $2 + 1; } elsif ($line =~ /^(\d+)a(\d+)$/o || - $line =~ /^\-\-\-\-\-\[after (\d+) inserted(?:\/moved)? (\d+)(?: \(was at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { - # Added a single line of text. - $old_linenumber = $1+1; - $new_linenumber = $2; - $new_length = 1; + $line =~ /^\-\-\-\-\-\[after (\d+) inserted(?:\/moved)? (\d+)(?: \(was at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { + # Added a single line of text. + $old_linenumber = $1+1; + $new_linenumber = $2; + $new_length = 1; } elsif ($line =~ /^(\d+),(\d+)d(\d+)$/o || - $line =~ /^\-\-\-\-\-\[deleted(?:\/moved)? (\d+)\-(\d+) after (\d+)(?: \(now at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { - # Multiple lines deleted. - $old_linenumber = $1; - $new_linenumber = $3+1; - $old_length = $2 - $1 + 1; + $line =~ /^\-\-\-\-\-\[deleted(?:\/moved)? (\d+)\-(\d+) after (\d+)(?: \(now at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { + # Multiple lines deleted. + $old_linenumber = $1; + $new_linenumber = $3+1; + $old_length = $2 - $1 + 1; } elsif ($line =~ /^(\d+)d(\d+)$/o || - $line =~ /^\-\-\-\-\-\[deleted(?:\/moved)? (\d+) after (\d+)(?: \(now at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { - # Single line deleted. - $old_linenumber = $1; - $new_linenumber = $2+1; - $old_length = 1; + $line =~ /^\-\-\-\-\-\[deleted(?:\/moved)? (\d+) after (\d+)(?: \(now at [\d\-]+\))?\]\-\-\-\-\-\s*$/o) { + # Single line deleted. + $old_linenumber = $1; + $new_linenumber = $2+1; + $old_length = 1; } elsif ($line =~ /^(\d+),(\d+)c(\d+),(\d+)$/o || - $line =~ /^\-\-\-\-\-\[(\d+)\-(\d+) changed to (\d+)\-(\d+)\]\-\-\-\-\-\s*$/o) { - # Multiple text lines changed. - $old_linenumber = $1; - $new_linenumber = $3; - $old_length = $2 - $1 + 1; - $new_length = $4 - $3 + 1; + $line =~ /^\-\-\-\-\-\[(\d+)\-(\d+) changed to (\d+)\-(\d+)\]\-\-\-\-\-\s*$/o) { + # Multiple text lines changed. + $old_linenumber = $1; + $new_linenumber = $3; + $old_length = $2 - $1 + 1; + $new_length = $4 - $3 + 1; } elsif ($line =~ /^(\d+)c(\d+),(\d+)$/o || - $line =~ /^\-\-\-\-\-\[(\d+) changed to (\d+)\-(\d+)\]\-\-\-\-\-\s*$/o) { - # Multiple source lines changed to single line. - $old_linenumber = $1; - $new_linenumber = $2; - $old_length = 1; - $new_length = $3 - $2 + 1; + $line =~ /^\-\-\-\-\-\[(\d+) changed to (\d+)\-(\d+)\]\-\-\-\-\-\s*$/o) { + # Multiple source lines changed to single line. + $old_linenumber = $1; + $new_linenumber = $2; + $old_length = 1; + $new_length = $3 - $2 + 1; } elsif ($line =~ /^(\d+),(\d+)c(\d+)$/o || - $line =~ /^\-\-\-\-\-\[(\d+)\-(\d+) changed to (\d+)\]\-\-\-\-\-\s*$/o) { - # Single source line changed to multiple lines. - $old_linenumber = $1; - $new_linenumber = $3; - $old_length = $2 - $1 + 1; - $new_length = 1; + $line =~ /^\-\-\-\-\-\[(\d+)\-(\d+) changed to (\d+)\]\-\-\-\-\-\s*$/o) { + # Single source line changed to multiple lines. + $old_linenumber = $1; + $new_linenumber = $3; + $old_length = $2 - $1 + 1; + $new_length = 1; } elsif ($line =~ /^(\d+)c(\d+)$/o || - $line =~ /^\-\-\-\-\-\[(\d+) changed to (\d+)\]\-\-\-\-\-\s*$/o) { - # Single line changed to another line. - $old_linenumber = $1; - $new_linenumber = $2; - $old_length = 1; - $new_length = 1; + $line =~ /^\-\-\-\-\-\[(\d+) changed to (\d+)\]\-\-\-\-\-\s*$/o) { + # Single line changed to another line. + $old_linenumber = $1; + $new_linenumber = $2; + $old_length = 1; + $new_length = 1; } else { - # Some other file format. - return undef; + # Some other file format. + return undef; } - + # The chunk in unidiff format. my $chunk_text = ""; - + # First read the old lines, if any. for (my $i = 0; $i < $old_length; $i++) { - $line = <$fh>; - if (defined $line && $line =~ /^\< (.*)$/) { - $chunk_text .= "-${1}\n"; - } else { - # Some other format. - return undef; - } + $line = <$fh>; + if (defined $line && $line =~ /^\< (.*)$/) { + $chunk_text .= "-${1}\n"; + } else { + # Some other format. + return undef; + } } - + # If there is both old and new text, read the separator line. # Note bloody VSS for some versions will put the --- at the end of # the previous line rather than on a new line! if ($old_length > 0 && $new_length > 0) { - my $previous_line = $line; - my $pos = $fh->getpos; - $line = <$fh>; - return undef unless defined $line; - if ($line !~ /^\-\-\-$/o && $chunk_text =~ /^(.*)\-\-\-$/os) { - # Stupid VSS diff format, chop off the seperator characters - # and move the file pointer back. - $chunk_text = "$1\n"; - $fh->setpos($pos); - } elsif ($line !~ /^\-\-\-$/o) { - # Didn't match standard separator, some other format. - return undef; - } + my $previous_line = $line; + my $pos = $fh->getpos; + $line = <$fh>; + return undef unless defined $line; + if ($line !~ /^\-\-\-$/o && $chunk_text =~ /^(.*)\-\-\-$/os) { + # Stupid VSS diff format, chop off the seperator characters + # and move the file pointer back. + $chunk_text = "$1\n"; + $fh->setpos($pos); + } elsif ($line !~ /^\-\-\-$/o) { + # Didn't match standard separator, some other format. + return undef; + } } - + # Now read the new lines, if any. for (my $i = 0; $i < $new_length; $i++) { - $line = <$fh>; - if (defined $line && $line =~ /^\> (.*)$/) { - $chunk_text .= "+${1}\n"; - } else { - # Some other format. - return undef; - } + $line = <$fh>; + if (defined $line && $line =~ /^\> (.*)$/) { + $chunk_text .= "+${1}\n"; + } else { + # Some other format. + return undef; + } } - + # Now create the chunk object, and return it. my $chunk = {}; $chunk->{filename} = $filename; Index: PerforceDescribe.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/FileParser/PerforceDescribe.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- PerforceDescribe.pm 29 Aug 2008 11:48:26 -0000 1.7 +++ PerforceDescribe.pm 6 Sep 2008 00:31:44 -0000 1.8 @@ -30,7 +30,7 @@ # Skip initial whitespace. my $line = <$fh>; while (defined($line) && $line =~ /^\s*$/) { - $line = <$fh>; + $line = <$fh>; } # Array of results found. @@ -51,8 +51,8 @@ # Skip the lines up to the table of contents. $line = <$fh>; while (defined($line) && $line !~ /^\.\.\./) { - $line = <$fh>; - return () unless defined $line; + $line = <$fh>; + return () unless defined $line; } # Now read the initial table of contents entries. For added or @@ -60,37 +60,37 @@ # repository, as it isn't included in the text of the diff, # unlike CVS. while (defined($line) && $line =~ /^\.\.\. (.*)\#(\d+) (.*)$/) { - my $entry = {}; - $entry->{filename} = $1; - $entry->{revision} = $2; - $entry->{change_type} = $3; - $entry->{repmatch} = 1; - $entry->{old_linenumber} = 0; - $entry->{new_linenumber} = 0; - $entry->{text} = ""; - if ($entry->{change_type} eq 'add') { - _retrieve_file($entry, $repository); - } elsif ($entry->{change_type} eq 'delete') { - # Need to retrieve the text of the previous revision number, - # as the current one is empty. - $entry->{revision}--; - _retrieve_file($entry, $repository); - $entry->{revision}++; - } else { - # Assume it is an edit, nothing else to do, as the diffs - # will be included below. - } - - # Add this to the table of contents array. - push @toc, $entry; - - $line = <$fh>; - return () unless defined $line; + my $entry = {}; + $entry->{filename} = $1; + $entry->{revision} = $2; + $entry->{change_type} = $3; + $entry->{repmatch} = 1; + $entry->{old_linenumber} = 0; + $entry->{new_linenumber} = 0; + $entry->{text} = ""; + if ($entry->{change_type} eq 'add') { + _retrieve_file($entry, $repository); + } elsif ($entry->{change_type} eq 'delete') { + # Need to retrieve the text of the previous revision number, + # as the current one is empty. + $entry->{revision}--; + _retrieve_file($entry, $repository); + $entry->{revision}++; + } else { + # Assume it is an edit, nothing else to do, as the diffs + # will be included below. + } + + # Add this to the table of contents array. + push @toc, $entry; + + $line = <$fh>; + return () unless defined $line; } # Skip the lines until the first diff chunk. while (defined($line) && $line !~ /^==== /) { - $line = <$fh>; + $line = <$fh>; } # Now read the actual diff chunks. Any entries not here will be added @@ -98,66 +98,66 @@ # retrieved from the repository. my $toc_index = 0; while (defined($line) && $line =~ /^====/) { - # Read the next diff chunk. - return () unless $line =~ /^==== (.*)\#(\d+) \((.*)\) ====$/; - my $filename = $1; - my $revision = $2; - my $filetype = $3; - - # Check if there are any outstanding added/removed entries from the - # toc that need to be processed first. - my $entry = $toc[$toc_index]; - while ($entry->{filename} ne $filename) { - my $chunk = _make_chunk($entry); - push @result, $chunk; - - # Check the next TOC entry, if any. - last if ($toc_index >= $#toc); - - $toc_index++; - $entry = $toc[$toc_index]; - } - - # Skip the next blank line before the unidiff. - $line = <$fh>; - next unless defined $line; - - if ($filetype =~ /.*text/) { - # Now read the entire diff chunk. - # Note there may be an optional '---' and '+++' lines - # before the chunk. - my $lastpos = tell $fh; - if (<$fh> !~ /^\-\-\-/ || <$fh> !~ /^\+\+\+/) { - # Move the file pointer back. - seek $fh, $lastpos, 0; - } - - my @file_diffs = Codestriker::FileParser::UnidiffUtils-> - read_unidiff_text($fh, $filename, $revision, $repmatch); - push @result, @file_diffs; - } else { - # Assume it is a binary file, initialise the chunk from the - # TOC entry, and flag it as binary. - my $chunk = _make_chunk($entry); - $chunk->{binary} = 1; - push @result, $chunk; - } - - # Move on to the next entry in the TOC. - $toc_index++; - - # Skip the next blank line before the next chunk. - $line = <$fh>; - while (defined $line && $line =~ /^\s*$/) { - $line = <$fh>; - } + # Read the next diff chunk. + return () unless $line =~ /^==== (.*)\#(\d+) \((.*)\) ====$/; + my $filename = $1; + my $revision = $2; + my $filetype = $3; + + # Check if there are any outstanding added/removed entries from the + # toc that need to be processed first. + my $entry = $toc[$toc_index]; + while ($entry->{filename} ne $filename) { + my $chunk = _make_chunk($entry); + push @result, $chunk; + + # Check the next TOC entry, if any. + last if ($toc_index >= $#toc); + + $toc_index++; + $entry = $toc[$toc_index]; + } + + # Skip the next blank line before the unidiff. + $line = <$fh>; + next unless defined $line; + + if ($filetype =~ /.*text/) { + # Now read the entire diff chunk... [truncated message content] |
From: <si...@us...> - 2008-09-06 11:12:33
|
User: sits Date: 08/09/06 04:12:31 Modified: bin install.pl . codestriker.conf Added: lib/Codestriker/Model User.pm Log: Initial implementation of the user model object. Also added in a configuration variable $admn_users into codestriker.conf to specify which users are admin. These will be created automatically when install.pl is run. Index: User.pm =================================================================== RCS file: User.pm diff -N User.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ User.pm 6 Sep 2008 11:12:31 -0000 1.1 @@ -0,0 +1,131 @@ +############################################################################### +# Codestriker: Copyright (c) 2001, 2002 David Sitsky. All rights reserved. +# si...@us... +# +# This program is free software; you can redistribute it and modify it under +# the terms of the GPL. + +# Model object for handling user data. + +package Codestriker::Model::User; + +use strict; + +use Codestriker::DB::DBI; + +# Create a User object from an existing record in the database. +sub new { + my ($class, $email) = @_; + my $self = {}; + + $self->{email} = $email; + + # Retrieve the specific user record. + my $dbh = Codestriker::DB::DBI->get_connection(); + eval { + my $select_user = + $dbh->prepare_cached('SELECT password_hash, admin ' . + 'FROM usertable ' . + 'WHERE email = ?'); + $select_user->execute($email); + + my ($password_hash, $admin) = $select_user->fetchrow_array(); + $select_user->finish(); + + $self->{password_hash} = $password_hash; + $self->{admin} = $admin; + }; + my $success = $@ ? 0 : 1; + + Codestriker::DB::DBI->release_connection($dbh, $success); + die $dbh->errstr unless $success; + + # Return the user record found. + bless $self, $class; + return $self; +} + + +# Create a new user into the database with all of the specified properties. +# Return the new password which has been assigned to the user. +sub create { + my ($type, $email, $admin) = @_; + + # Obtain a database connection. + my $dbh = Codestriker::DB::DBI->get_connection(); + + # Create a random password for the new user. + my $new_password = _create_random_password(); + my $password_hash = _hash_password($new_password); + + # Insert the row into the database. + eval { + my $insert_user = + $dbh->prepare_cached('INSERT INTO usertable (email, password_hash, admin) ' . + 'VALUES (?, ?, ?)'); + + $insert_user->execute($email, $password_hash, $admin); + }; + my $success = $@ ? 0 : 1; + + Codestriker::DB::DBI->release_connection($dbh, $success); + die $dbh->errstr unless $success; + + # Return the password that was created. + return $new_password; +} + +# Determine if the specific user already exists. +sub exists { + my ($type, $email) = @_; + + # Obtain a database connection. + my $dbh = Codestriker::DB::DBI->get_connection(); + + my $count = 0; + eval { + my $select_email = + $dbh->prepare_cached('SELECT COUNT(*) FROM usertable ' . + 'WHERE email = ?'); + $select_email->execute($email); + ($count) = $select_email->fetchrow_array(); + $select_email->finish(); + }; + my $success = $@ ? 0 : 1; + + Codestriker::DB::DBI->release_connection($dbh, $success); + die $dbh->errstr unless $success; + + return $count; +} + +# Method for producing a hash from a password. +sub _hash_password { + my ($password) = @_; + + # List of characters that can be used for the salt. + my @salt_characters = ( '.', '/', 'A'..'Z', 'a'..'z', '0' ..'9' ); + + # Generate the salt. Generate an 8 character value in case we are on + # a system which uses MD5 digests (48 bit - 6 * 8). Older systems just + # use the first two characters. + my $salt = ''; + for (my $i = 0; $i < 8; $i++) { + $salt .= $salt_characters[rand(64)]; + } + + # Crypt the password. + my $cryptedpassword = crypt($password, $salt); + + # Return the crypted password. + return $cryptedpassword; + } + +# Method for creating a random password consisting of alphanumeric +# characters. +sub _create_random_password { + my @password_characters = ( 'A'..'Z', 'a'..'z', '0' ..'9' ); + return join("", map{ $password_characters[rand 62] } (1..8)); +} + +1; Index: install.pl =================================================================== RCS file: /cvsroot/codestriker/codestriker/bin/install.pl,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- install.pl 6 Sep 2008 00:31:50 -0000 1.22 +++ install.pl 6 Sep 2008 11:12:31 -0000 1.23 @@ -54,6 +54,7 @@ eval("use Codestriker::FileParser::Parser"); eval("use Codestriker::FileParser::UnknownFormat"); eval("use Codestriker::Model::File"); +eval("use Codestriker::Model::User"); # Set this variables, to avoid compilation warnings below. $Codestriker::COMMENT_SUBMITTED = 0; @@ -572,6 +573,15 @@ indexes => [dbindex(name=>"project_name_idx", column_names=>["name"])]); +# This table records all users which are present in the system. +my $user_table = + table(name => "usertable", + columns => [col(name=>"email", type=>$VARCHAR, length=>200, pk=>1), + col(name=>"password_hash", type=>$VARCHAR, length=>128), + col(name=>"admin", type=>$INT16) + ], + indexes => []); + # Add all of the Codestriker tables into an array. my @tables = (); push @tables, $topic_table; @@ -589,6 +599,7 @@ push @tables, $topicfile_table; push @tables, $delta_table; push @tables, $project_table; +push @tables, $user_table; # Move a table into table_old, create the table with the new definitions, # and create the indexes. @@ -1057,7 +1068,18 @@ print "Failed because of $@\n"; } +# Now create any admin users, if necessary. $dbh->{PrintError} = 1; +if (defined $Codestriker::admin_users) { + foreach my $admin_user (@{ $Codestriker::admin_users }) { + if (!Codestriker::Model::User->exists($admin_user)) { + print "Creating admin user $admin_user...\n"; + Codestriker::Model::User->create($admin_user, 1); + # TODO: consider sending email with password details. + print "Done\n"; + } + } +} # Now generate the contents of the codestriker.pl file, with the appropriate # configuration details set (basically, the location of the lib dir). Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.104 retrieving revision 1.105 diff -u -r1.104 -r1.105 --- codestriker.conf 6 Sep 2008 03:31:05 -0000 1.104 +++ codestriker.conf 6 Sep 2008 11:12:31 -0000 1.105 @@ -33,6 +33,15 @@ #$dbpasswd = 'manager'; $dbpasswd = 'cspasswd'; +# Email addresses of admin users for this installation. Admin users +# have unrestricted access to the system. Non-admin users will not +# be able to create/edit/delete projects. If no admin user is defined +# then no login system will be used, and all users will be effectively +# admin users. +#$admin_users = [ 'dav...@gm...' ]; +#$admin_users = [ 'dav...@gm...', 'si...@us...' ]; +$admin_users = []; + # Location of the mailing host. This is used when sending out codestriker # comments. $mailhost = 'localhost'; |
From: <si...@us...> - 2008-09-06 11:33:07
|
User: sits Date: 08/09/06 04:33:06 Modified: lib/Codestriker/Model User.pm bin install.pl . codestriker.conf Log: Also handle situation here an "admin upgrade" occurs for an existing user. Index: User.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Model/User.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- User.pm 6 Sep 2008 11:12:31 -0000 1.1 +++ User.pm 6 Sep 2008 11:33:06 -0000 1.2 @@ -45,6 +45,44 @@ return $self; } +# Update an existing user record with a new password. +sub update_password { + my ($self, $new_password) = @_; + + my $password_hash = _hash_password($new_password); + my $dbh = Codestriker::DB::DBI->get_connection(); + eval { + my $update_user = + $dbh->prepare_cached('UPDATE usertable SET password_hash = ? ' . + 'WHERE email = ?'); + $update_user->execute($password_hash, $self->{email}); + }; + my $success = $@ ? 0 : 1; + + Codestriker::DB::DBI->release_connection($dbh, $success); + die $dbh->errstr unless $success; + + $self->{password_hash} = $password_hash; +} + +# Update an existing user record with new admin status. +sub update_admin { + my ($self, $new_admin) = @_; + + my $dbh = Codestriker::DB::DBI->get_connection(); + eval { + my $update_user = + $dbh->prepare_cached('UPDATE usertable SET admin = ? ' . + 'WHERE email = ?'); + $update_user->execute($new_admin, $self->{email}); + }; + my $success = $@ ? 0 : 1; + + Codestriker::DB::DBI->release_connection($dbh, $success); + die $dbh->errstr unless $success; + + $self->{admin} = $new_admin; +} # Create a new user into the database with all of the specified properties. # Return the new password which has been assigned to the user. Index: install.pl =================================================================== RCS file: /cvsroot/codestriker/codestriker/bin/install.pl,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- install.pl 6 Sep 2008 11:12:31 -0000 1.23 +++ install.pl 6 Sep 2008 11:33:06 -0000 1.24 @@ -55,6 +55,7 @@ eval("use Codestriker::FileParser::UnknownFormat"); eval("use Codestriker::Model::File"); eval("use Codestriker::Model::User"); +use Codestriker::Model::User; # Set this variables, to avoid compilation warnings below. $Codestriker::COMMENT_SUBMITTED = 0; @@ -1077,6 +1078,14 @@ Codestriker::Model::User->create($admin_user, 1); # TODO: consider sending email with password details. print "Done\n"; + } else { + # Existing user, check if they are an admin already. + my $user = Codestriker::Model::User->new($admin_user); + if (! $user->{admin}) { + print "Upgrading non-admin user $admin_user to admin...\n"; + $user->update_admin(1); + print "Done\n"; + } } } } Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.105 retrieving revision 1.106 diff -u -r1.105 -r1.106 --- codestriker.conf 6 Sep 2008 11:12:31 -0000 1.105 +++ codestriker.conf 6 Sep 2008 11:33:06 -0000 1.106 @@ -38,9 +38,9 @@ # be able to create/edit/delete projects. If no admin user is defined # then no login system will be used, and all users will be effectively # admin users. -#$admin_users = [ 'dav...@gm...' ]; +$admin_users = [ 'dav...@gm...' ]; #$admin_users = [ 'dav...@gm...', 'si...@us...' ]; -$admin_users = []; +#$admin_users = []; # Location of the mailing host. This is used when sending out codestriker # comments. |