[Collab-qa-commits] r577 - in svnbuildstat/trunk/lib/SvnBuildStat: . Vcs
goneri-guest at alioth.debian.org
goneri-guest at alioth.debian.org
Wed Dec 12 17:11:20 UTC 2007
Author: goneri-guest
Date: 2007-12-12 17:11:20 +0000 (Wed, 12 Dec 2007)
New Revision: 577
Added:
svnbuildstat/trunk/lib/SvnBuildStat/Vcs/
svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Git.pm
svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Svn.pm
Modified:
svnbuildstat/trunk/lib/SvnBuildStat/Vcs.pm
Log:
import of the Vcs object
Added: svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Git.pm
===================================================================
--- svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Git.pm (rev 0)
+++ svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Git.pm 2007-12-12 17:11:20 UTC (rev 577)
@@ -0,0 +1,136 @@
+package SvnBuildStat::Vcs::Git;
+
+use strict;
+use warnings;
+
+use File::Temp;
+
+# TODO
+# create a function to generate repodirname
+
+sub new {
+
+ my (undef, $uri, $localdir) = @_;
+
+ my $self;
+
+ $self->{uri} = $uri;
+ $self->{localdir} = $localdir;
+
+# if ($uri =~ /ssh:\/\/([\w\.-]+)(\/.+)$/) {
+# # For the moment, I only support Alioth
+# $self->{reporoot} = $2;
+# } else {
+# info ("can't parse repository uri: `$uri'");
+# return;
+# }
+
+
+ bless $self;
+
+}
+
+sub refresh {
+ my ($self) = @_;
+
+ return unless $self->{localdir};
+ return unless $self->{uri};
+ if ((!-d $self->{localdir}) && !mkdir($self->{localdir}) ) {
+ return;
+ }
+ my $repodirname;
+ if ($self->{uri} =~ /([-\w_+~]+)\.git$/) {
+ $repodirname = $1;
+ }
+ return unless $repodirname;
+
+ my $cmd;
+
+ if (-d $self->{localdir}.'/'.$repodirname) {
+ $cmd = "cd ".$self->{localdir}.'/'.$repodirname."; git pull";
+ } else {
+ $cmd = "cd ".$self->{localdir}."; git clone ".$self->{uri};
+ }
+ `$cmd`;
+ $self->currentRev();
+
+ return;
+
+}
+
+
+
+sub getLastVcsChanges {
+
+ my ($self,$nbr) = @_;
+
+ my $repodirname;
+ if (!$self->{uri} =~ /\/(\W+)\.git$/) {
+ return;
+ }
+ $repodirname = $1;
+ $nbr = 5 unless $nbr =~ /^\d+$/;
+
+ my $cmd;
+ if (-d $self->{localdir}.'/'.$repodirname) {
+ $cmd = "cd ".$self->{localdir}.'/'.$repodirname."; git log -n".$nbr;
+ }
+
+ my $rev;
+ my $login;
+ my $date;
+ my $text;
+
+ my @changes;
+ foreach (`$cmd`) {
+ if (/^commit\s(\w{10})/) {
+ if ($rev) {
+ push @changes, { rev => $rev, login => $login, date => $date, text => $text};
+ $rev = $login = $date = $text = undef;
+ }
+ $rev = $1
+ } elsif (/Author:\s(.*)/) {
+ $login = $1;
+ } elsif (/Date:\s+(\S.*)/) {
+ $date = $1;
+ } elsif (/^\s{4}(.*)/) {
+ $text .= $1."\n";
+ }
+ }
+
+ return \@changes;
+
+}
+
+sub exportIn {
+
+ my ($self, $dir) = @_;
+
+ my $tmpdir = mktemp("svnbuildstat-vcs-git-XXXX");
+
+ my $repodirname;
+ if ($self->{uri} =~ /([-\w_+~]+)\.git$/) {
+ $repodirname = $1;
+ }
+
+ my $cmd = "cp -rf ".$self->{localdir}.'/'.$repodirname."/* ".$dir;
+ `rm -rf $dir/.git`; # remove the git directory from the exported directory
+
+}
+
+sub currentRev {
+ my ($self) = @_;
+
+ my $repodirname;
+ if ($self->{uri} =~ /([-\w_+~]+)\.git$/) {
+ $repodirname = $1;
+ }
+ return unless $repodirname;
+
+ my $cmd = "cd ".$self->{localdir}.'/'.$repodirname."; git log -n 1 --pretty=oneline";
+ foreach (`$cmd`) {
+ return $1 if /^(\w+) /;
+ }
+}
+
+1;
Added: svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Svn.pm
===================================================================
--- svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Svn.pm (rev 0)
+++ svnbuildstat/trunk/lib/SvnBuildStat/Vcs/Svn.pm 2007-12-12 17:11:20 UTC (rev 577)
@@ -0,0 +1,107 @@
+package SvnBuildStat::Vcs::Svn;
+
+use strict;
+use warnings;
+
+use File::Basename;
+
+sub new {
+
+ my (undef, $uri, $localdir) = @_;
+
+ my $self;
+
+ $self->{uri} = $uri;
+ $self->{localdir} = $localdir;
+
+
+ bless $self;
+
+}
+
+sub refresh {
+ my ($self) = @_;
+
+ return unless $self->{localdir};
+ return unless $self->{uri};
+ if ((!-d $self->{localdir}) && !mkdir($self->{localdir}) ) {
+ return;
+ }
+
+
+ # I need the --ignore-externals because some external repository
+ # needs ssh auth and make it asking for a password...
+ my $cmd = "cd ".$self->{localdir}."; svn co -q --ignore-externals ".$self->{uri}." .";
+ `$cmd`;
+
+ return $self->currentRev();
+
+}
+
+sub getLastVcsChanges {
+
+ my ($self,$nbr) = @_;
+
+ return unless $self->{localdir};
+ return unless -d $self->{localdir};
+ $nbr = 5 unless $nbr =~ /^\d+$/;
+
+ my @changes;
+
+ my $cmd = "cd ".$self->{localdir}."&& LC_ALL=C svn log --limit $nbr";
+
+ my $begin;
+ my $rev;
+ my $login;
+ my $date;
+ my $text;
+ foreach my $line (`$cmd`) {
+ if ($line =~ /^------------------------------------------------------------------------/) {
+ $begin = 1;
+ if ($rev) {
+ push @changes, { rev => $rev, login => $login, date => $date, text => $text};
+ $rev = $login = $date = $text = undef;
+ }
+ } elsif ($begin) {
+ if ($line =~ /r(\d+)\s\|\s(\S+)\s\|\s(20\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d)/) {
+ $rev = $1;
+ $login = $2;
+ $date = $3;
+
+ $begin = 0;
+ }
+
+ } else {
+ $text .= $line;
+ }
+
+ }
+
+
+ return \@changes;
+
+}
+
+sub exportIn {
+
+ my ($self, $dir) = @_;
+
+ return unless $dir;
+ my $cmd = "cp -r $self->{localdir}/* $dir";
+ `$cmd`;
+ $cmd = "find $dir -type d -name '.svn' -exec rm -Rf {} \\;";
+ `$cmd`;
+
+}
+
+sub currentRev {
+ my ($self) = @_;
+
+ my $cmd = "cd ".$self->{localdir}."; LC_ALL=C svn info";
+ foreach (`$cmd`) {
+ return $1 if /Revision: (\d+)/;
+ }
+
+}
+
+1;
Modified: svnbuildstat/trunk/lib/SvnBuildStat/Vcs.pm
===================================================================
--- svnbuildstat/trunk/lib/SvnBuildStat/Vcs.pm 2007-12-12 17:04:54 UTC (rev 576)
+++ svnbuildstat/trunk/lib/SvnBuildStat/Vcs.pm 2007-12-12 17:11:20 UTC (rev 577)
@@ -1,26 +1,25 @@
package SvnBuildStat::Vcs;
+use strict;
+use warnings;
+
use Logger::Syslog;
use SvnBuildStat::Vcs::Git;
use SvnBuildStat::Vcs::Svn;
sub new {
- my (undef, $vcs, $uri) = @_;
+ my (undef, $params) = @_;
- return unless $vcs;
- return unless $uri;
-
# TODO rewrite this in a more dynamic way
- my $return;
- if ($vcs eq "git") {
- $ret = new SvnBuildStat::Vcs::Git($uri);
- } elsif ($vcs eq "svn") {
- $ret = new SvnBuildStat::Vcs::Svn($uri);
+ if ($params->{vcstype} eq "git") {
+ return new SvnBuildStat::Vcs::Git($params->{uri}, $params->{localdir});
+ } elsif ($params->{vcstype} eq "svn") {
+ return new SvnBuildStat::Vcs::Svn($params->{uri}, $params->{localdir});
} else {
- debug ("unknow vcs type: $vcs");
+ debug ("unknow vcs type: ".$params->{vcstype});
}
- return $ret;
+ return;
}
More information about the Collab-qa-commits
mailing list