[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