Added Hg local cache management feature.
authorThomasE
Fri, 19 Jun 2009 14:38:25 +0100
changeset 166 32693583e769
parent 165 25e06db2f72b
child 168 bf91a7e3c25b
Added Hg local cache management feature.
common/build.xml
common/tools/cachefiles.pl
--- a/common/build.xml	Thu Jun 18 14:32:22 2009 +0100
+++ b/common/build.xml	Fri Jun 19 14:38:25 2009 +0100
@@ -24,13 +24,24 @@
     <property name="build.system" value="${sf.spec.build.system}"/>
     <property name="base_release.path" value="${sf.spec.baseline.location}"/>
     <property name="base_release.getenv_options" value="${sf.spec.baseline.getenv_options}"/>
-
+	
+	
     <!-- import all core HELIUM targets -->
     <import file="${helium.dir}/helium.ant.xml" />
     
     <!-- import common references -->
     <import file="${sf.common.config.dir}/common_refs.ant.xml" />
              
+	<!-- setup conditional Helium internal properties -->
+	<if><istrue value="${sf.spec.sourcesync.usecache}"/>
+		<then>
+			<property name="sf.spec.sourcesync.sourcespecdir" value="${sf.common.config.dir}/generated"/>
+		</then>
+		<else>
+			<property name="sf.spec.sourcesync.sourcespecdir" value="${sf.project.location}"/>
+		</else>
+	</if>
+
     <!-- conditional import of generated source spec if available -->
     <if><available  file="${sf.common.config.dir}/generated/source-spec.ant.xml" />
         <then>
@@ -40,7 +51,7 @@
     </if>
      
     
-    <target name="sf-prep" depends="sf-generate-source-spec,prep-drive,init-build-area,check-tool-dependencies,create-bom,log-build-env">
+    <target name="sf-prep" depends="prep-drive,init-build-area,sf-generate-source-spec,check-tool-dependencies,create-bom,log-build-env">
         <echo>[SF-PREP]</echo>
         <tempfile property="prep.dynamic.config" suffix="ant.xml" destdir="${temp.build.dir}"/>
     </target>
@@ -48,7 +59,7 @@
     <target name="sf-build-all" depends="sf-prebuild,sf-build-noprep,sf-postbuild">
         <echo>[SF-BUILD-ALL]</echo>
     </target>
-
+    
     <target name="sf-build-and-pack" depends="sf-build-noprep,sf-postbuild">
         <echo>[SF-BUILD-AND-PACK]</echo>
     </target>
@@ -64,6 +75,20 @@
     </target>
     
     <target name="sf-generate-source-spec" depends="sf-parse-project-config">
+	
+		<!-- Generate the sources.csv if hg cache is activated -->
+		<if><istrue value="${sf.spec.sourcesync.usecache}"/>
+			<then>
+				<echo message="Generating Hg local cache..." />
+				<exec executable="perl" dir="${build.log.dir}" failonerror="true" output="${build.log.dir}/${build.id}_hgcache.log">
+					<arg value="${sf.common.config.dir}/tools/cachefiles.pl"/>
+					<arg value="${sf.spec.job.rootdir}/hgcache"/>
+					<arg value="${sf.project.location}/${sf.spec.sourcesync.sourcespecfile}"/>
+					<arg value="${sf.common.config.dir}/generated/${sf.spec.sourcesync.sourcespecfile}"/>
+				</exec>
+			</then>
+		</if>
+		
         <!-- TODO: 1. Same file name souce-spec.ant.xml is used for all packages
         for multiple package builds, this needs to be linked with package name. -->
         <!-- TODO: 2. Change fmpp data to be a full property rather than relative path -->
@@ -72,7 +97,7 @@
               outputFile="${sf.common.config.dir}/generated/source-spec.ant.xml">
               <data expandProperties="yes">
                     ant: antProperties()
-                    data: csv(${sf.project.location}/${sf.spec.sourcesync.sourcespecfile}, {separator:','})
+                    data: csv(${sf.spec.sourcesync.sourcespecdir}/${sf.spec.sourcesync.sourcespecfile}, {separator:','})
               </data>
         </fmpp>
     </target>
@@ -435,7 +460,7 @@
               outputFile="${sf.common.config.dir}/generated/tag-hg-code.ant.xml">
             <data expandProperties="yes">
                 ant: antProperties()
-                data: csv(${sf.project.location}/${sf.spec.sourcesync.sourcespecfile}, {separator:','})
+                data: csv(${sf.spec.sourcesync.sourcespecdir}/${sf.spec.sourcesync.sourcespecfile}, {separator:','})
             </data>
         </fmpp>
         <ant antfile="${sf.common.config.dir}/generated/tag-hg-code.ant.xml"/>
@@ -458,7 +483,7 @@
         <mkdir dir="${sf.common.config.dir}/generated"/>
         <exec executable="perl" dir="${build.drive}/" failonerror="false" output="${build.log.dir}/zipconfig.log">
             <arg value="${sf.common.config.dir}/tools/populateziptemplate.pl"/>
-            <arg value="${sf.project.location}/${sf.spec.sourcesync.sourcespecfile}"/>
+            <arg value="${sf.spec.sourcesync.sourcespecdir}/${sf.spec.sourcesync.sourcespecfile}"/>
             <arg value="${sf.common.config.dir}/templates/zip.cfg.xml.ftl.template"/>
             <arg value="${sf.common.config.dir}/generated/zip.cfg.xml.ftl"/>
         </exec>
@@ -641,7 +666,7 @@
 
         <exec executable="perl" dir="${build.log.dir}/analysis" failonerror="false" output="${build.log.dir}/analysis/${build.id}_analysecomponents.log">
             <arg value="${sf.common.config.dir}/tools/analysis/analyse_components.pl"/>
-            <arg value="${sf.project.location}/${sf.spec.sourcesync.sourcespecfile}"/>
+            <arg value="${sf.spec.sourcesync.sourcespecdir}/${sf.spec.sourcesync.sourcespecfile}"/>
             <arg value="${build.id}_what_results.csv_results.csv"/>
             <arg value="${sf.project.location}/sysdefs/system_model_os_contributed.xml"/>
             <arg value="${sf.project.location}/sysdefs/system_model_s60_contributed.xml"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/cachefiles.pl	Fri Jun 19 14:38:25 2009 +0100
@@ -0,0 +1,128 @@
+#!/usr/bin/perl
+
+
+use strict;
+
+#my $cache = "d:/HG_cache/";
+#my $master = "//v800008/Builds01/";
+my $cache = shift @ARGV;
+my $csv = shift @ARGV;
+my $generated = shift @ARGV;
+my @recover;
+my @nospace;
+my $exitcode = 0;
+
+if(defined $cache && defined $generated && defined $csv)
+{ 
+  print "Cache:$cache\nIn:$csv\nOut:$generated\n";
+  
+  # Format the cache directory path
+  if ( $cache !~ /(.*)[\\\/]$/ )
+  {
+	$cache .= "/";
+  }
+  
+  open(IN, "<$csv") or die "Couldn't open $csv for reading";
+  open(OUT,">$generated") or die "Couldn't open $generated for writing";
+  my $header = <IN>;
+  print OUT $header;
+  while( my $line = <IN>)
+  {
+    my @args = split(',',$line);
+    my $repo = shift @args;
+	my $master = "";
+	if ( $repo =~ m/^(.*\/)((oss|rnd|sfl)\/.*\/)$/i )
+	{
+		$master = $1;
+		$repo = $2;
+	}
+    if(-d $master.$repo.".hg")
+    {
+  #    print "Found:\t".$master.$repo.".hg\n";
+      my $cmd;
+      if(-d $cache.$repo.".hg") # update
+      {
+        $cmd = "hg pull -R $cache$repo $master$repo";
+      }
+      else #clone
+      {
+        #taken from the normal clone script...
+        my @dirs = split ('\/', $cache.$repo);
+        my $destdir = pop @dirs;
+        my $path = "";    
+        foreach my $dir (@dirs)
+          {
+          $path = ($path eq "") ? $dir : "$path/$dir";
+          if (!-d $path)
+            {
+            mkdir $path;
+            }
+          }
+            
+        $cmd = "hg clone -U $master$repo $cache$repo";
+      }  
+      if(cache($cmd))
+        {
+          print OUT $cache.$repo.",".join(',', @args);
+        }
+      else
+        {
+           print OUT $master.$repo.",".join(',', @args);
+		   $exitcode = 1;
+        }
+    }
+    else
+    {
+      print "Error: cannot find ".$master.$repo.".hg\n";
+	  $exitcode = 1;
+    }
+  }
+  
+  close OUT;
+  close IN;
+}
+else
+{
+  print "Usage: <cache_path> <source_csv> <generated_csv>";
+  $exitcode = 1;
+}
+
+foreach my $line (@recover)
+{
+  print "WARNING: HG Recover: $line\n";
+}
+foreach my $line (@nospace)
+{
+  print "WARNING: No Space: $line\n";
+}
+
+exit $exitcode;
+
+sub cache($cmd)
+{
+  my $cmd = shift;
+  print "$cmd\n";
+  
+  open(CMD, "$cmd 2>&1 |") or die "Couldn't execute $cmd";
+  while(my $line = <CMD>)
+  {
+#    print $line;
+    # parse the output for failures. On fail return 0;
+    if($line =~ m/abort/i)
+    {
+      print $line;
+      if($line =~ m/hg\s+recover/i)
+      {
+        push(@recover, $cmd);
+      }
+      elsif($line =~ m/No\s+space/i)
+      {
+        push(@nospace, $cmd);
+      }
+      close CMD;
+      return 0;
+    }    
+  }
+  close CMD;
+  return 1;
+}
\ No newline at end of file