azkaban-developers

Details

.travis.yml 4(+4 -0)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..dcd8f5b
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,4 @@
+languages: java
+install:
+ - time npm install -g less dustjs-linkedin
+script: ant

build.xml 101(+77 -24)

diff --git a/build.xml b/build.xml
index ac8160f..ae0373f 100644
--- a/build.xml
+++ b/build.xml
@@ -26,9 +26,9 @@
 	<property name="less.src.dir" value="${basedir}/src/less" />
 	<property name="web.src.dir" value="${basedir}/src/web" />
 	<property name="sql.src.dir" value="${basedir}/src/sql" />
-	
-	<property name="azkaban.jar" value="${dist.jar.dir}/${name}-${version}.jar" />
 
+	<property name="version.file" value="${dist.packages.dir}/azkaban.version" />
+	
 	<property environment="env" />
 
 	<path id="main.classpath">
@@ -41,9 +41,36 @@
 
 	<!-- set the build number based on environment variable, otherwise blank -->
 	<property environment="env" description="System environment variables (including those set by Hudson)" />
-
+	
 	<target name="all" depends="clean, package" description="Builds jars and packages." />
-
+	
+	<available file=".git" type="dir" property="git.present"/>
+	<target name="git.info" description="Store git info" if="git.present">
+	    <exec executable="git" outputproperty="git.commithash" failifexecutionfails="false" errorproperty="">
+	        <arg value="rev-parse"/>
+	    	<arg value="HEAD"/>
+	    </exec>
+		
+	    <exec executable="git" outputproperty="git.repo" failifexecutionfails="false" errorproperty="">
+	        <arg value="config"/>
+	    	<arg value="--get"/>
+	    	<arg value="remote.origin.url"/>
+	    </exec>
+		
+	    <exec executable="git" outputproperty="git.tag" failifexecutionfails="false" errorproperty="">
+	        <arg value="describe"/>
+	    	<arg value="--abbrev=0"/>
+	    	<arg value="--tags"/>
+	    </exec>
+	    <condition property="git.tag" value="${git.tag}" else="${version}">
+	        <and>
+	            <isset property="git.tag"/>
+	            <length string="${git.tag}" trim="yes" length="0" when="greater"/>
+	        </and>
+	    </condition>
+		<echo>Git tag found to be ${git.commithash} with tag ${git.tag} from repo ${git.repo}</echo>
+	</target>
+	
 	<target name="clean" description="Delete generated files.">
 		<echo message="Deleting generated files in dist" />
 		<delete dir="${dist.jar.dir}" />
@@ -78,7 +105,24 @@
 		</copy>
 	</target>
 	
-	<target name="build" description="Compile main source tree java files">
+	<target name="repo.file" depends="git.info" description="Create a file to reference the git commit">
+		<delete file="azkaban.version" />
+		
+		<tstamp>
+			<format timezone="UTC" property="current.time" pattern="yyyy-MM-dd hh:mm zzz"/>
+		</tstamp>
+		
+		<!-- Need to remove indents of the echo contents, because echo into file includes the tabs -->
+<echo file="${version.file}">
+${git.tag}
+${git.commithash}
+${git.repo}
+${current.time}
+</echo>
+	</target>
+	
+	<target name="build" depends="git.info, repo.file" description="Compile main source tree java files">
+		<echo>Building Classes</echo>
 		<delete dir="${dist.classes.dir}" />
 		<mkdir dir="${dist.classes.dir}" />
 		
@@ -125,7 +169,7 @@
 	
 	<target name="jars" depends="build" description="Create azkaban jar">
 		<mkdir dir="${dist.jar.dir}" />
-		<jar destfile="${azkaban.jar}">
+		<jar destfile="azkaban-${git.tag}.jar">
 			<fileset dir="${dist.classes.dir}">
 				<include name="**/*.*" />
 			</fileset>
@@ -165,7 +209,7 @@
 		<delete dir="${dist.sql.package.dir}" />
 		<mkdir dir="${dist.sql.package.dir}" />
 
-		<concat destfile="${dist.sql.package.dir}/create-all-sql-${version}.sql" fixlastline="yes">
+		<concat destfile="${dist.sql.package.dir}/create-all-sql-${git.tag}.sql" fixlastline="yes">
 			<fileset dir="${sql.src.dir}" >
 				<exclude name="update.*.sql"/>
 				<exclude name="database.properties"/>
@@ -181,10 +225,10 @@
 		<copy todir="${dist.sql.package.dir}" >
 			<fileset dir="${sql.src.dir}" />
 		</copy>
-		<echo file="${dist.sql.package.dir}/database.properties" append="true">version=${version}</echo>
+		<echo file="${dist.sql.package.dir}/database.properties" append="true">version=${git.tag}</echo>
 
-		<tar destfile="${dist.sql.package.dir}/${name}-sql-script-${version}.tar.gz" compression="gzip" longfile="gnu">
-			<tarfileset dir="${dist.sql.package.dir}" prefix="azkaban-${version}" filemode="755" />
+		<tar destfile="${dist.sql.package.dir}/${name}-sql-script-${git.tag}.tar.gz" compression="gzip" longfile="gnu">
+			<tarfileset dir="${dist.sql.package.dir}" prefix="azkaban-${git.tag}" filemode="755" />
 		</tar>
 	</target>
 
@@ -199,7 +243,7 @@
 		<mkdir dir="${dist.web.package.dir}/extlib" />	
 			
 		<!-- Copy Azkaban jars and libs-->
-		<copy file="${azkaban.jar}" todir="${dist.web.package.dir}/lib" />
+		<copy file="azkaban-${git.tag}.jar" todir="${dist.web.package.dir}/lib" />
 		<copy todir="${dist.web.package.dir}/lib" >
 			<fileset dir="${lib.dir}" >
 				<exclude name="hadoop-core*.jar"/>
@@ -231,11 +275,14 @@
 			<fileset dir="${web.package.dir}/conf" />
 		</copy>
 		
+		<!-- Copy version file -->
+		<copy file="${version.file}" todir="${dist.web.package.dir}" />
+		
 		<!-- Tarball it -->
-		<tar destfile="${dist.web.package.dir}/${name}-web-server-${version}.tar.gz" compression="gzip" longfile="gnu">
-			<tarfileset dir="${dist.web.package.dir}" prefix="azkaban-${version}" filemode="755" includes="bin/*" />
+		<tar destfile="${dist.web.package.dir}/${name}-web-server-${git.tag}.tar.gz" compression="gzip" longfile="gnu">
+			<tarfileset dir="${dist.web.package.dir}" prefix="azkaban-${git.tag}" filemode="755" includes="bin/*" />
 			
-			<tarfileset dir="${dist.web.package.dir}" prefix="azkaban-${version}" includes="**">
+			<tarfileset dir="${dist.web.package.dir}" prefix="azkaban-${git.tag}" includes="**">
 				<exclude name="bin/*"/>
 			</tarfileset>
 		</tar>
@@ -251,7 +298,7 @@
 		<mkdir dir="${dist.exec.package.dir}/extlib" />
 				
 		<!-- Copy Azkaban jars and libs-->
-		<copy file="${azkaban.jar}" todir="${dist.exec.package.dir}/lib" />
+		<copy file="azkaban-${git.tag}.jar" todir="${dist.exec.package.dir}/lib" />
 		<copy todir="${dist.exec.package.dir}/lib" >
 			<fileset dir="${lib.dir}" >
 				<exclude name="hadoop-core*.jar"/>
@@ -268,11 +315,14 @@
 			<fileset dir="${exec.package.dir}/conf" />
 		</copy>
 		
+		<!-- Copy version file -->
+		<copy file="${version.file}" todir="${dist.exec.package.dir}" />
+		
 		<!-- Tarball it -->
-		<tar destfile="${dist.exec.package.dir}/${name}-executor-server-${version}.tar.gz" compression="gzip" longfile="gnu">
-			<tarfileset dir="${dist.exec.package.dir}" prefix="azkaban-${version}" filemode="755" includes="bin/*" />
+		<tar destfile="${dist.exec.package.dir}/${name}-executor-server-${git.tag}.tar.gz" compression="gzip" longfile="gnu">
+			<tarfileset dir="${dist.exec.package.dir}" prefix="azkaban-${git.tag}" filemode="755" includes="bin/*" />
 			
-			<tarfileset dir="${dist.exec.package.dir}" prefix="azkaban-${version}" includes="**">
+			<tarfileset dir="${dist.exec.package.dir}" prefix="azkaban-${git.tag}" includes="**">
 				<exclude name="bin/*"/>
 			</tarfileset>
 		</tar>
@@ -289,7 +339,7 @@
 		<mkdir dir="${dist.solo.package.dir}/sql" />
 				
 		<!-- Copy Azkaban jars and libs-->
-		<copy file="${azkaban.jar}" todir="${dist.solo.package.dir}/lib" />
+		<copy file="azkaban-${git.tag}.jar" todir="${dist.solo.package.dir}/lib" />
 		<copy todir="${dist.solo.package.dir}/lib" >
 			<fileset dir="${lib.dir}" >
 				<exclude name="hadoop-core*.jar"/>
@@ -325,13 +375,16 @@
 		<copy todir="${dist.solo.package.dir}/sql" >
 			<fileset dir="${sql.src.dir}" />
 		</copy>
-		<echo file="${dist.solo.package.dir}/sql/database.properties" append="true">version=${version}</echo>
-			
+		<echo file="${dist.solo.package.dir}/sql/database.properties" append="true">version=${git.tag}</echo>
+		
+		<!-- Copy version file -->
+		<copy file="${version.file}" todir="${dist.solo.package.dir}" />
+
 		<!-- Tarball it -->
-		<tar destfile="${dist.solo.package.dir}/${name}-solo-server-${version}.tar.gz" compression="gzip" longfile="gnu">
-			<tarfileset dir="${dist.solo.package.dir}" prefix="azkaban-${version}" filemode="755" includes="bin/*" />
+		<tar destfile="${dist.solo.package.dir}/${name}-solo-server-${git.tag}.tar.gz" compression="gzip" longfile="gnu">
+			<tarfileset dir="${dist.solo.package.dir}" prefix="azkaban-${git.tag}" filemode="755" includes="bin/*" />
 			
-			<tarfileset dir="${dist.solo.package.dir}" prefix="azkaban-${version}" includes="**">
+			<tarfileset dir="${dist.solo.package.dir}" prefix="azkaban-${git.tag}" includes="**">
 				<exclude name="bin/*"/>
 			</tarfileset>
 		</tar>

README.md 2(+2 -0)

diff --git a/README.md b/README.md
index d0a972f..b55096d 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 ## Azkaban2
 
+[![Build Status](https://travis-ci.org/azkaban/azkaban2.png?branch=master)](https://travis-ci.org/azkaban/azkaban2)
+
 For Azkaban documentation, please go to
 [Azkaban Project Site](http://azkaban.github.io/azkaban2/)
 There is a google groups: [Azkaban Group](https://groups.google.com/forum/?fromgroups#!forum/azkaban-dev)
diff --git a/src/java/azkaban/execapp/JobRunner.java b/src/java/azkaban/execapp/JobRunner.java
index cbdcecc..28a96d1 100644
--- a/src/java/azkaban/execapp/JobRunner.java
+++ b/src/java/azkaban/execapp/JobRunner.java
@@ -434,7 +434,6 @@ public class JobRunner extends EventHandler implements Runnable {
 				writeStatus();
 				fireEvent(Event.create(this, Type.JOB_STATUS_CHANGED), false);
 				runJob();
-				writeStatus();
 			}
 			else {
 				changeStatus(Status.FAILED);
@@ -451,6 +450,7 @@ public class JobRunner extends EventHandler implements Runnable {
 		fireEvent(Event.create(this, Type.JOB_FINISHED), false);
 		finalizeLogFile();
 		finalizeAttachmentFile();
+		writeStatus();
 	}
 	
 	private boolean prepareJob() throws RuntimeException {
diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index d173bd0..f8811fa 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -944,10 +944,9 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 				jobInfo = null;
 			}
 			page.add("history", jobInfo);
+
+			page.add("previous", new PageSelection("Previous", pageSize, true, false, Math.max(pageNum - 1, 1)));
 			
-			if (pageNum == 1) {
-				page.add("previous", new PageSelection("Previous", pageSize, true, false, pageNum - 1));
-			}
 			page.add("next", new PageSelection("Next", pageSize, false, false, Math.min(pageNum + 1, maxPage)));
 
 			if (jobInfo != null) {
diff --git a/src/java/azkaban/webapp/servlet/velocity/jobhistorypage.vm b/src/java/azkaban/webapp/servlet/velocity/jobhistorypage.vm
index 63856ec..e45e168 100644
--- a/src/java/azkaban/webapp/servlet/velocity/jobhistorypage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/jobhistorypage.vm
@@ -127,13 +127,13 @@
           </table>
 
 					<ul class="pagination" id="pageSelection">
-						<li id="previous" class="first"><a href="${context}/manager?project=${projectId}&job=${jobid}&history&page=${previous.page}&size=${previous.size}"><span class="arrow">&larr;</span>Previous</a></li>
-						<li id="page1" #if($page1.selected) class="selected" #elseif ($page1.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page1.nextPage}&size=${page1.size}">${page1.page}</a></li>
-						<li id="page2" #if($page2.selected) class="selected" #elseif ($page2.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page2.nextPage}&size=${page2.size}">${page2.page}</a></li>
-						<li id="page3" #if($page3.selected) class="selected" #elseif ($page3.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page3.nextPage}&size=${page3.size}">${page3.page}</a></li>
-						<li id="page4" #if($page4.selected) class="selected" #elseif ($page4.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page4.nextPage}&size=${page4.size}">${page4.page}</a></li>
-						<li id="page5" #if($page5.selected) class="selected" #elseif ($page5.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page5.nextPage}&size=${page5.size}">${page5.page}</a></li>
-						<li id="next"><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${next.page}&size=${next.size}">Next<span class="arrow">&rarr;</span></a></li>
+						<li id="previous" class="first"><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${previous.nextPage}&size=${previous.size}"><span class="arrow">&larr;</span>Previous</a></li>
+						<li id="page1" #if($page1.selected) class="active" #elseif ($page1.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page1.nextPage}&size=${page1.size}">${page1.page}</a></li>
+						<li id="page2" #if($page2.selected) class="active" #elseif ($page2.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page2.nextPage}&size=${page2.size}">${page2.page}</a></li>
+						<li id="page3" #if($page3.selected) class="active" #elseif ($page3.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page3.nextPage}&size=${page3.size}">${page3.page}</a></li>
+						<li id="page4" #if($page4.selected) class="active" #elseif ($page4.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page4.nextPage}&size=${page4.size}">${page4.page}</a></li>
+						<li id="page5" #if($page5.selected) class="active" #elseif ($page5.disabled) class="disabled" #end><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${page5.nextPage}&size=${page5.size}">${page5.page}</a></li>
+						<li id="next"><a href="${context}/manager?project=${projectName}&job=${jobid}&history&page=${next.nextPage}&size=${next.size}">Next<span class="arrow">&rarr;</span></a></li>
 					</ul>
 
 				</div><!-- /.col-xs-12 -->
diff --git a/src/web/js/azkaban/view/flow.js b/src/web/js/azkaban/view/flow.js
index f7b17a4..b5466c4 100644
--- a/src/web/js/azkaban/view/flow.js
+++ b/src/web/js/azkaban/view/flow.js
@@ -174,7 +174,7 @@ azkaban.ExecutionsView = Backbone.View.extend({
 		var page = this.model.get("page");
 		
 		//Start it off
-		$("#pageSelection .selected").removeClass("selected");
+		$("#pageSelection .active").removeClass("active");
 		
 		// Disable if less than 5
 		console.log("Num pages " + numPages)
@@ -207,34 +207,39 @@ azkaban.ExecutionsView = Backbone.View.extend({
 		}
 		
 		// Selection is always in middle unless at barrier.
+		var startPage = 0;
+		var selectionPosition = 0;
 		if (page < 3) {
 			selectionPosition = page;
+			startPage = 1;
 		}
-		else if (page > numPages - 2) {
-			selectionPosition = 5 - (numPages - page) - 1;
+		else if (page == numPages) {
+			selectionPosition = 5;
+			startPage = numPages - 4;
+		}
+		else if (page == numPages - 1) {
+			selectionPosition = 4;
+			startPage = numPages - 4;
 		}
 		else {
 			selectionPosition = 3;
+			startPage = page - 2;
 		}
 
-		$("#page"+selectionPosition).addClass("selected");
+		$("#page"+selectionPosition).addClass("active");
 		$("#page"+selectionPosition)[0].page = page;
 		var selecta = $("#page" + selectionPosition + " a");
 		selecta.text(page);
 		selecta.attr("href", "#page" + page);
 
-		for (var j = 1, tpage = page - selectionPosition + 1; j < selectionPosition; ++j, ++tpage) {
-			$("#page" + j)[0].page = tpage;
-			var a = $("#page" + i + " a");
-			a.text(tpage);
-			a.attr("href", "#page" + tpage);
-		}
-
-		for (var i = selectionPosition + 1, tpage = page + 1; i <= numPages; ++i, ++tpage) {
-			$("#page" + i)[0].page = tpage;
-			var a = $("#page" + i + " a");
-			a.text(tpage);
-			a.attr("href", "#page" + tpage);
+		for (var j = 0; j < 5; ++j) {
+			var realPage = startPage + j;
+			var elementId = "#page" + (j+1);
+			
+			$(elementId)[0].page = realPage;
+			var a = $(elementId + " a");
+			a.text(realPage);
+			a.attr("href", "#page" + realPage);
 		}
 	},
 	
diff --git a/src/web/js/azkaban/view/time-graph.js b/src/web/js/azkaban/view/time-graph.js
index c56a39f..7cb3f6f 100644
--- a/src/web/js/azkaban/view/time-graph.js
+++ b/src/web/js/azkaban/view/time-graph.js
@@ -65,7 +65,7 @@ azkaban.TimeGraphView = Backbone.View.extend({
 		}
 
 		var graphDiv = document.createElement('div');
-		$(this.graphContainer).append(graphDiv);
+		$(this.graphContainer).html(graphDiv);
 
     var lineColorsCallback = function(row, sidx, type) {
       if (type != 'point') {