<!DOCTYPE html>
<html lang='en'>
<head>
<title>jquery.git - jQuery JavaScript Library: https://github.com/jquery/jquery</title>
<meta name='generator' content='cgit v1.2.3'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='https://source.dussan.org/jquery.git/atom/?h=dependabot/github_actions/github-actions-6951dec90a' type='application/atom+xml'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/'>index</a> : <a href='/jquery.git/'>jquery.git</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='a16339b8933f115da3661f3d3f64854c3fa60bdc'/><select name='h' onchange='this.form.submit();'>
<option value='1.12-stable'>1.12-stable</option>
<option value='2.2-stable'>2.2-stable</option>
<option value='3.6-stable'>3.6-stable</option>
<option value='3.x-stable'>3.x-stable</option>
<option value='broken-test'>broken-test</option>
<option value='dependabot/github_actions/github-actions-0b02fec6e3'>dependabot/github_actions/github-actions-0b02fec6e3</option>
<option value='dependabot/github_actions/github-actions-384b59e5c3'>dependabot/github_actions/github-actions-384b59e5c3</option>
<option value='dependabot/github_actions/github-actions-66959c3ab9'>dependabot/github_actions/github-actions-66959c3ab9</option>
<option value='dependabot/github_actions/github-actions-6951dec90a' selected='selected'>dependabot/github_actions/github-actions-6951dec90a</option>
<option value='dependabot/github_actions/github-actions-7574396d95'>dependabot/github_actions/github-actions-7574396d95</option>
<option value='dependabot/github_actions/github-actions-a2938ab9b9'>dependabot/github_actions/github-actions-a2938ab9b9</option>
<option value='dependabot/github_actions/github-actions-ced721f930'>dependabot/github_actions/github-actions-ced721f930</option>
<option value='dependabot/github_actions/github-actions-f50e11107c'>dependabot/github_actions/github-actions-f50e11107c</option>
<option value='dependabot/npm_and_yarn/form-data-4.0.4'>dependabot/npm_and_yarn/form-data-4.0.4</option>
<option value='dependabot/npm_and_yarn/multi-b97207525a'>dependabot/npm_and_yarn/multi-b97207525a</option>
<option value='dependabot/npm_and_yarn/rollup-4.22.4'>dependabot/npm_and_yarn/rollup-4.22.4</option>
<option value='jtr-test'>jtr-test</option>
<option value='main'>main</option>
<option value='mgol-patch-1'>mgol-patch-1</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>jQuery JavaScript Library: https://github.com/jquery/jquery</td><td class='sub right'>www-data</td></tr></table>
<table class='tabs'><tr><td>
<a href='/jquery.git/about/?h=dependabot/github_actions/github-actions-6951dec90a'>about</a><a href='/jquery.git/?h=dependabot/github_actions/github-actions-6951dec90a'>summary</a><a href='/jquery.git/refs/?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>refs</a><a href='/jquery.git/log/?h=dependabot/github_actions/github-actions-6951dec90a'>log</a><a href='/jquery.git/tree/?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>tree</a><a href='/jquery.git/commit/?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>commit</a><a class='active' href='/jquery.git/diff/?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>diff</a><a href='/jquery.git/stats/?h=dependabot/github_actions/github-actions-6951dec90a'>stats</a></td><td class='form'><form class='right' method='get' action='/jquery.git/log/'>
<input type='hidden' name='h' value='dependabot/github_actions/github-actions-6951dec90a'/><input type='hidden' name='id' value='a16339b8933f115da3661f3d3f64854c3fa60bdc'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='h' value='dependabot/github_actions/github-actions-6951dec90a'/><input type='hidden' name='id' value='a16339b8933f115da3661f3d3f64854c3fa60bdc'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><div class='diffstat-header'><a href='/jquery.git/diff/?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>Diffstat</a></div><table summary='diffstat' class='diffstat'><tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/jquery.git/diff/src/core.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>src/core.js</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='64%'><tr><td class='add' style='width: 10.9%;'/><td class='rem' style='width: 3.1%;'/><td class='none' style='width: 85.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/jquery.git/diff/test/unit/core.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>test/unit/core.js</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='64%'><tr><td class='add' style='width: 96.9%;'/><td class='rem' style='width: 3.1%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/jquery.git/diff/test/unit/deferred.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>test/unit/deferred.js</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='64%'><tr><td class='add' style='width: 59.4%;'/><td class='rem' style='width: 9.4%;'/><td class='none' style='width: 31.2%;'/></tr></table></td></tr>
</table><div class='diffstat-summary'>3 files changed, 107 insertions, 10 deletions</div><table summary='diff' class='diff'><tr><td><div class='head'>diff --git a/src/core.js b/src/core.js<br/>index 54b44b1ea..83d427c78 100644<br/>--- a/<a href='/jquery.git/tree/src/core.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=1d2df772b4d6e5dbf91df6e75f4a1809f7879ab0'>src/core.js</a><br/>+++ b/<a href='/jquery.git/tree/src/core.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>src/core.js</a></div><div class='hunk'>@@ -212,7 +212,12 @@ jQuery.extend( {</div><div class='ctx'> 	noop: function() {},</div><div class='ctx'> </div><div class='ctx'> 	isFunction: function( obj ) {</div><div class='del'>-		return jQuery.type( obj ) === "function";</div><div class='add'>+</div><div class='add'>+		// Support: Chrome &lt;=57, Firefox &lt;=52</div><div class='add'>+		// In some browsers, typeof returns "function" for HTML &lt;object&gt; elements</div><div class='add'>+		// (i.e., `typeof document.createElement( "object" ) === "function"`).</div><div class='add'>+		// We don't want to classify *any* DOM node as a function.</div><div class='add'>+		return typeof obj === "function" &amp;&amp; typeof obj.nodeType !== "number";</div><div class='ctx'> 	},</div><div class='ctx'> </div><div class='ctx'> 	isWindow: function( obj ) {</div><div class='hunk'>@@ -464,7 +469,7 @@ function isArrayLike( obj ) {</div><div class='ctx'> 	var length = !!obj &amp;&amp; "length" in obj &amp;&amp; obj.length,</div><div class='ctx'> 		type = jQuery.type( obj );</div><div class='ctx'> </div><div class='del'>-	if ( type === "function" || jQuery.isWindow( obj ) ) {</div><div class='add'>+	if ( jQuery.isFunction( obj ) || jQuery.isWindow( obj ) ) {</div><div class='ctx'> 		return false;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='head'>diff --git a/test/unit/core.js b/test/unit/core.js<br/>index adccfb58f..c717711da 100644<br/>--- a/<a href='/jquery.git/tree/test/unit/core.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=1d2df772b4d6e5dbf91df6e75f4a1809f7879ab0'>test/unit/core.js</a><br/>+++ b/<a href='/jquery.git/tree/test/unit/core.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>test/unit/core.js</a></div><div class='hunk'>@@ -406,7 +406,7 @@ QUnit[ "assign" in Object ? "test" : "skip" ]( "isPlainObject(Object.assign(...)</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> QUnit.test( "isFunction", function( assert ) {</div><div class='del'>-	assert.expect( 19 );</div><div class='add'>+	assert.expect( 20 );</div><div class='ctx'> </div><div class='ctx'> 	var mystr, myarr, myfunction, fn, obj, nodes, first, input, a;</div><div class='ctx'> </div><div class='hunk'>@@ -439,9 +439,11 @@ QUnit.test( "isFunction", function( assert ) {</div><div class='ctx'> 	fn = function() {};</div><div class='ctx'> 	assert.ok( jQuery.isFunction( fn ), "Normal Function" );</div><div class='ctx'> </div><div class='add'>+	assert.notOk( jQuery.isFunction( Object.create( fn ) ), "custom Function subclass" );</div><div class='add'>+</div><div class='ctx'> 	obj = document.createElement( "object" );</div><div class='ctx'> </div><div class='del'>-	// Firefox says this is a function</div><div class='add'>+	// Some versions of Firefox and Chrome say this is a function</div><div class='ctx'> 	assert.ok( !jQuery.isFunction( obj ), "Object Element" );</div><div class='ctx'> </div><div class='ctx'> 	// Since 1.3, this isn't supported (#2968)</div><div class='hunk'>@@ -491,6 +493,64 @@ QUnit.test( "isFunction", function( assert ) {</div><div class='ctx'> 	} );</div><div class='ctx'> } );</div><div class='ctx'> </div><div class='add'>+QUnit.test( "isFunction(cross-realm function)", function( assert ) {</div><div class='add'>+	assert.expect( 1 );</div><div class='add'>+</div><div class='add'>+	var iframe, doc,</div><div class='add'>+		done = assert.async();</div><div class='add'>+</div><div class='add'>+	// Functions from other windows should be matched</div><div class='add'>+	Globals.register( "iframeDone" );</div><div class='add'>+	window.iframeDone = function( fn, detail ) {</div><div class='add'>+		window.iframeDone = undefined;</div><div class='add'>+		assert.ok( jQuery.isFunction( fn ), "cross-realm function" +</div><div class='add'>+			( detail ? " - " + detail : "" ) );</div><div class='add'>+		done();</div><div class='add'>+	};</div><div class='add'>+</div><div class='add'>+	iframe = jQuery( "#qunit-fixture" )[ 0 ].appendChild( document.createElement( "iframe" ) );</div><div class='add'>+	doc = iframe.contentDocument || iframe.contentWindow.document;</div><div class='add'>+	doc.open();</div><div class='add'>+	doc.write( "&lt;body onload='window.parent.iframeDone( function() {} );'&gt;" );</div><div class='add'>+	doc.close();</div><div class='add'>+} );</div><div class='add'>+</div><div class='add'>+supportjQuery.each(</div><div class='add'>+	{</div><div class='add'>+		GeneratorFunction: "function*() {}",</div><div class='add'>+		AsyncFunction: "async function() {}"</div><div class='add'>+	},</div><div class='add'>+	function( subclass, source ) {</div><div class='add'>+		var fn;</div><div class='add'>+		try {</div><div class='add'>+			fn = Function( "return " + source )();</div><div class='add'>+		} catch ( e ) {}</div><div class='add'>+</div><div class='add'>+		QUnit[ fn ? "test" : "skip" ]( "isFunction(" + subclass + ")",</div><div class='add'>+			function( assert ) {</div><div class='add'>+				assert.expect( 1 );</div><div class='add'>+</div><div class='add'>+				assert.equal( jQuery.isFunction( fn ), true, source );</div><div class='add'>+			}</div><div class='add'>+		);</div><div class='add'>+	}</div><div class='add'>+);</div><div class='add'>+</div><div class='add'>+QUnit[ typeof Symbol === "function" &amp;&amp; Symbol.toStringTag ? "test" : "skip" ](</div><div class='add'>+	"isFunction(custom @@toStringTag)",</div><div class='add'>+	function( assert ) {</div><div class='add'>+		assert.expect( 2 );</div><div class='add'>+</div><div class='add'>+		var obj = {},</div><div class='add'>+			fn = function() {};</div><div class='add'>+		obj[ Symbol.toStringTag ] = "Function";</div><div class='add'>+		fn[ Symbol.toStringTag ] = "Object";</div><div class='add'>+</div><div class='add'>+		assert.equal( jQuery.isFunction( obj ), false, "function-mimicking object" );</div><div class='add'>+		assert.equal( jQuery.isFunction( fn ), true, "object-mimicking function" );</div><div class='add'>+	}</div><div class='add'>+);</div><div class='add'>+</div><div class='ctx'> QUnit.test( "isNumeric", function( assert ) {</div><div class='ctx'> 	assert.expect( 43 );</div><div class='ctx'> </div><div class='head'>diff --git a/test/unit/deferred.js b/test/unit/deferred.js<br/>index 426af4b5f..f64d4fec8 100644<br/>--- a/<a href='/jquery.git/tree/test/unit/deferred.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=1d2df772b4d6e5dbf91df6e75f4a1809f7879ab0'>test/unit/deferred.js</a><br/>+++ b/<a href='/jquery.git/tree/test/unit/deferred.js?h=dependabot/github_actions/github-actions-6951dec90a&amp;id=a16339b8933f115da3661f3d3f64854c3fa60bdc'>test/unit/deferred.js</a></div><div class='hunk'>@@ -526,9 +526,10 @@ QUnit.test( "jQuery.Deferred.then - spec compatibility", function( assert ) {</div><div class='ctx'> </div><div class='ctx'> 	assert.expect( 1 );</div><div class='ctx'> </div><div class='del'>-	var done = assert.async();</div><div class='add'>+	var done = assert.async(),</div><div class='add'>+		defer = jQuery.Deferred();</div><div class='ctx'> </div><div class='del'>-	var defer = jQuery.Deferred().done( function() {</div><div class='add'>+	defer.done( function() {</div><div class='ctx'> 		setTimeout( done );</div><div class='ctx'> 		throw new Error();</div><div class='ctx'> 	} );</div><div class='hunk'>@@ -542,6 +543,26 @@ QUnit.test( "jQuery.Deferred.then - spec compatibility", function( assert ) {</div><div class='ctx'> 	} catch ( _ ) {}</div><div class='ctx'> } );</div><div class='ctx'> </div><div class='add'>+QUnit[ typeof Symbol === "function" &amp;&amp; Symbol.toStringTag ? "test" : "skip" ](</div><div class='add'>+	"jQuery.Deferred.then - IsCallable determination (gh-3596)",</div><div class='add'>+	function( assert ) {</div><div class='add'>+</div><div class='add'>+		assert.expect( 1 );</div><div class='add'>+</div><div class='add'>+		var done = assert.async(),</div><div class='add'>+			defer = jQuery.Deferred();</div><div class='add'>+</div><div class='add'>+		function faker() {</div><div class='add'>+			assert.ok( true, "handler with non-'Function' @@toStringTag gets invoked" );</div><div class='add'>+		}</div><div class='add'>+		faker[ Symbol.toStringTag ] = "String";</div><div class='add'>+</div><div class='add'>+		defer.then( faker ).then( done );</div><div class='add'>+</div><div class='add'>+		defer.resolve();</div><div class='add'>+	}</div><div class='add'>+);</div><div class='add'>+</div><div class='ctx'> // Test fails in IE9 but is skipped there because console is not active</div><div class='ctx'> QUnit[ window.console ? "test" : "skip" ]( "jQuery.Deferred.exceptionHook", function( assert ) {</div><div class='ctx'> </div><div class='hunk'>@@ -861,8 +882,16 @@ QUnit.test( "jQuery.when(nonThenable) - like Promise.resolve", function( assert</div><div class='ctx'> QUnit.test( "jQuery.when(thenable) - like Promise.resolve", function( assert ) {</div><div class='ctx'> 	"use strict";</div><div class='ctx'> </div><div class='del'>-	var CASES = 16,</div><div class='del'>-		slice = [].slice,</div><div class='add'>+	var customToStringThen = {</div><div class='add'>+		then: function( onFulfilled ) {</div><div class='add'>+			onFulfilled();</div><div class='add'>+		}</div><div class='add'>+	};</div><div class='add'>+	if ( typeof Symbol === "function" ) {</div><div class='add'>+		customToStringThen.then[ Symbol.toStringTag ] = "String";</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	var slice = [].slice,</div><div class='ctx'> 		sentinel = { context: "explicit" },</div><div class='ctx'> 		eventuallyFulfilled = jQuery.Deferred().notify( true ),</div><div class='ctx'> 		eventuallyRejected = jQuery.Deferred().notify( true ),</div><div class='hunk'>@@ -870,6 +899,7 @@ QUnit.test( "jQuery.when(thenable) - like Promise.resolve", function( assert ) {</div><div class='ctx'> 		secondaryRejected = jQuery.Deferred().resolve( eventuallyRejected ),</div><div class='ctx'> 		inputs = {</div><div class='ctx'> 			promise: Promise.resolve( true ),</div><div class='add'>+			customToStringThen: customToStringThen,</div><div class='ctx'> 			rejectedPromise: Promise.reject( false ),</div><div class='ctx'> 			deferred: jQuery.Deferred().resolve( true ),</div><div class='ctx'> 			eventuallyFulfilled: eventuallyFulfilled,</div><div class='hunk'>@@ -894,6 +924,7 @@ QUnit.test( "jQuery.when(thenable) - like Promise.resolve", function( assert ) {</div><div class='ctx'> 		},</div><div class='ctx'> 		willSucceed = {</div><div class='ctx'> 			promise: [ true ],</div><div class='add'>+			customToStringThen: [],</div><div class='ctx'> 			deferred: [ true ],</div><div class='ctx'> 			eventuallyFulfilled: [ true ],</div><div class='ctx'> 			secondaryFulfilled: [ true ],</div><div class='hunk'>@@ -912,14 +943,15 @@ QUnit.test( "jQuery.when(thenable) - like Promise.resolve", function( assert ) {</div><div class='ctx'> 			rejectedDeferredWith: [ false ],</div><div class='ctx'> 			multiRejectedDeferredWith: [ "baz", "quux" ]</div><div class='ctx'> 		},</div><div class='add'>+		numCases = Object.keys( willSucceed ).length + Object.keys( willError ).length,</div><div class='ctx'> </div><div class='ctx'> 		// Support: Android 4.0 only</div><div class='ctx'> 		// Strict mode functions invoked without .call/.apply get global-object context</div><div class='ctx'> 		defaultContext = ( function getDefaultContext() { return this; } ).call(),</div><div class='ctx'> </div><div class='del'>-		done = assert.async( CASES * 2 );</div><div class='add'>+		done = assert.async( numCases * 2 );</div><div class='ctx'> </div><div class='del'>-	assert.expect( CASES * 4 );</div><div class='add'>+	assert.expect( numCases * 4 );</div><div class='ctx'> </div><div class='ctx'> 	jQuery.each( inputs, function( message, value ) {</div><div class='ctx'> 		var code = "jQuery.when( " + message + " )",</div></td></tr></table></div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2025-08-10 22:43:48 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
<a id='n578' href='#n578'>578</a>
<a id='n579' href='#n579'>579</a>
<a id='n580' href='#n580'>580</a>
<a id='n581' href='#n581'>581</a>
<a id='n582' href='#n582'>582</a>
<a id='n583' href='#n583'>583</a>
<a id='n584' href='#n584'>584</a>
<a id='n585' href='#n585'>585</a>
<a id='n586' href='#n586'>586</a>
<a id='n587' href='#n587'>587</a>
<a id='n588' href='#n588'>588</a>
<a id='n589' href='#n589'>589</a>
<a id='n590' href='#n590'>590</a>
<a id='n591' href='#n591'>591</a>
<a id='n592' href='#n592'>592</a>
<a id='n593' href='#n593'>593</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="cm">/*</span>
<span class="cm"> * Copyright 2013 gitblit.com.</span>
<span class="cm"> *</span>
<span class="cm"> * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span>
<span class="cm"> * you may not use this file except in compliance with the License.</span>
<span class="cm"> * You may obtain a copy of the License at</span>
<span class="cm"> *</span>
<span class="cm"> *     http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="cm"> *</span>
<span class="cm"> * Unless required by applicable law or agreed to in writing, software</span>
<span class="cm"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span>
<span class="cm"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="cm"> * See the License for the specific language governing permissions and</span>
<span class="cm"> * limitations under the License.</span>
<span class="cm"> */</span>
<span class="kn">package</span><span class="w"> </span><span class="nn">com.gitblit.git</span><span class="p">;</span>

<span class="kn">import static</span><span class="w"> </span><span class="nn">org.eclipse.jgit.transport.BasePackPushConnection.CAPABILITY_SIDE_BAND_64K</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">groovy.lang.Binding</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">groovy.util.GroovyScriptEngine</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.File</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.IOException</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.text.MessageFormat</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Collection</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.LinkedHashSet</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.List</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Set</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.concurrent.TimeUnit</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.lib.BatchRefUpdate</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.lib.NullProgressMonitor</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.lib.PersonIdent</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.lib.ProgressMonitor</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.lib.Repository</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.revwalk.RevCommit</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.transport.PostReceiveHook</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.transport.PreReceiveHook</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.transport.ReceiveCommand</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.transport.ReceiveCommand.Result</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.transport.ReceivePack</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.slf4j.Logger</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.slf4j.LoggerFactory</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.Constants</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.Constants.AccessRestrictionType</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.IStoredSettings</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.Keys</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.client.Translation</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.extensions.ReceiveHook</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.manager.IGitblit</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.models.RepositoryModel</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.models.UserModel</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.tickets.BranchTicketService</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.utils.ArrayUtils</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.utils.ClientLogger</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.utils.CommitCache</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.utils.JGitUtils</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.utils.RefLogUtils</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.utils.StringUtils</span><span class="p">;</span>


<span class="cm">/**</span>
<span class="cm"> * GitblitReceivePack processes receive commands.  It also executes Groovy pre-</span>
<span class="cm"> * and post- receive hooks.</span>
<span class="cm"> *</span>
<span class="cm"> * The general execution flow is:</span>
<span class="cm"> * &lt;ol&gt;</span>
<span class="cm"> *    &lt;li&gt;onPreReceive()&lt;/li&gt;</span>
<span class="cm"> *    &lt;li&gt;executeCommands()&lt;/li&gt;</span>
<span class="cm"> *    &lt;li&gt;onPostReceive()&lt;/li&gt;</span>
<span class="cm"> * &lt;/ol&gt;</span>
<span class="cm"> *</span>
<span class="cm"> * @author Android Open Source Project</span>
<span class="cm"> * @author James Moger</span>
<span class="cm"> *</span>
<span class="cm"> */</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">GitblitReceivePack</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">ReceivePack</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">PreReceiveHook</span><span class="p">,</span><span class="w"> </span><span class="n">PostReceiveHook</span><span class="w"> </span><span class="p">{</span>

<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Logger</span><span class="w"> </span><span class="n">LOGGER</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LoggerFactory</span><span class="p">.</span><span class="na">getLogger</span><span class="p">(</span><span class="n">GitblitReceivePack</span><span class="p">.</span><span class="na">class</span><span class="p">);</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">RepositoryModel</span><span class="w"> </span><span class="n">repository</span><span class="p">;</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">UserModel</span><span class="w"> </span><span class="n">user</span><span class="p">;</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">File</span><span class="w"> </span><span class="n">groovyDir</span><span class="p">;</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">gitblitUrl</span><span class="p">;</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="n">GroovyScriptEngine</span><span class="w"> </span><span class="n">gse</span><span class="p">;</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">IStoredSettings</span><span class="w"> </span><span class="n">settings</span><span class="p">;</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">IGitblit</span><span class="w"> </span><span class="n">gitblit</span><span class="p">;</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="nf">GitblitReceivePack</span><span class="p">(</span>
<span class="w">			</span><span class="n">IGitblit</span><span class="w"> </span><span class="n">gitblit</span><span class="p">,</span>
<span class="w">			</span><span class="n">Repository</span><span class="w"> </span><span class="n">db</span><span class="p">,</span>
<span class="w">			</span><span class="n">RepositoryModel</span><span class="w"> </span><span class="n">repository</span><span class="p">,</span>
<span class="w">			</span><span class="n">UserModel</span><span class="w"> </span><span class="n">user</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>

<span class="w">		</span><span class="kd">super</span><span class="p">(</span><span class="n">db</span><span class="p">);</span>
<span class="w">		</span><span class="k">this</span><span class="p">.</span><span class="na">settings</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gitblit</span><span class="p">.</span><span class="na">getSettings</span><span class="p">();</span>
<span class="w">		</span><span class="k">this</span><span class="p">.</span><span class="na">gitblit</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gitblit</span><span class="p">;</span>
<span class="w">		</span><span class="k">this</span><span class="p">.</span><span class="na">repository</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">repository</span><span class="p">;</span>
<span class="w">		</span><span class="k">this</span><span class="p">.</span><span class="na">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">user</span><span class="p">;</span>
<span class="w">		</span><span class="k">this</span><span class="p">.</span><span class="na">groovyDir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gitblit</span><span class="p">.</span><span class="na">getHooksFolder</span><span class="p">();</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// set Grape root</span>
<span class="w">			</span><span class="n">File</span><span class="w"> </span><span class="n">grapeRoot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gitblit</span><span class="p">.</span><span class="na">getGrapesFolder</span><span class="p">();</span>
<span class="w">			</span><span class="n">grapeRoot</span><span class="p">.</span><span class="na">mkdirs</span><span class="p">();</span>
<span class="w">			</span><span class="n">System</span><span class="p">.</span><span class="na">setProperty</span><span class="p">(</span><span class="s">&quot;grape.root&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">grapeRoot</span><span class="p">.</span><span class="na">getAbsolutePath</span><span class="p">());</span>
<span class="w">			</span><span class="k">this</span><span class="p">.</span><span class="na">gse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">GroovyScriptEngine</span><span class="p">(</span><span class="n">groovyDir</span><span class="p">.</span><span class="na">getAbsolutePath</span><span class="p">());</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">IOException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="c1">// set advanced ref permissions</span>
<span class="w">		</span><span class="n">setAllowCreates</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="na">canCreateRef</span><span class="p">(</span><span class="n">repository</span><span class="p">));</span>
<span class="w">		</span><span class="n">setAllowDeletes</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="na">canDeleteRef</span><span class="p">(</span><span class="n">repository</span><span class="p">));</span>
<span class="w">		</span><span class="n">setAllowNonFastForwards</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="na">canRewindRef</span><span class="p">(</span><span class="n">repository</span><span class="p">));</span>

<span class="w">		</span><span class="kt">int</span><span class="w"> </span><span class="n">maxObjectSz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">settings</span><span class="p">.</span><span class="na">getInteger</span><span class="p">(</span><span class="n">Keys</span><span class="p">.</span><span class="na">git</span><span class="p">.</span><span class="na">maxObjectSizeLimit</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">maxObjectSz</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">setMaxObjectSizeLimit</span><span class="p">(</span><span class="n">maxObjectSz</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="kt">int</span><span class="w"> </span><span class="n">maxPackSz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">settings</span><span class="p">.</span><span class="na">getInteger</span><span class="p">(</span><span class="n">Keys</span><span class="p">.</span><span class="na">git</span><span class="p">.</span><span class="na">maxPackSizeLimit</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">maxPackSz</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">setMaxPackSizeLimit</span><span class="p">(</span><span class="n">maxPackSz</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="n">setCheckReceivedObjects</span><span class="p">(</span><span class="n">settings</span><span class="p">.</span><span class="na">getBoolean</span><span class="p">(</span><span class="n">Keys</span><span class="p">.</span><span class="na">git</span><span class="p">.</span><span class="na">checkReceivedObjects</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">));</span>
<span class="w">		</span><span class="n">setCheckReferencedObjectsAreReachable</span><span class="p">(</span><span class="n">settings</span><span class="p">.</span><span class="na">getBoolean</span><span class="p">(</span><span class="n">Keys</span><span class="p">.</span><span class="na">git</span><span class="p">.</span><span class="na">checkReferencedObjectsAreReachable</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">));</span>

<span class="w">		</span><span class="c1">// setup pre and post receive hook</span>
<span class="w">		</span><span class="n">setPreReceiveHook</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="w">		</span><span class="n">setPostReceiveHook</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * Returns true if the user is permitted to apply the receive commands to</span>
<span class="cm">	 * the repository.</span>
<span class="cm">	 *</span>
<span class="cm">	 * @param commands</span>
<span class="cm">	 * @return true if the user may push these commands</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">canPush</span><span class="p">(</span><span class="n">Collection</span><span class="o">&lt;</span><span class="n">ReceiveCommand</span><span class="o">&gt;</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="c1">// TODO Consider supporting branch permissions here (issue-36)</span>
<span class="w">		</span><span class="c1">// Not sure if that should be Gerrit-style, refs/meta/config, or</span>
<span class="w">		</span><span class="c1">// gitolite-style, permissions in users.conf</span>
<span class="w">		</span><span class="c1">//</span>
<span class="w">		</span><span class="c1">// How could commands be empty?</span>
<span class="w">		</span><span class="c1">//</span>
<span class="w">		</span><span class="c1">// Because a subclass, like PatchsetReceivePack, filters receive</span>
<span class="w">		</span><span class="c1">// commands before this method is called.  This makes it possible for</span>
<span class="w">		</span><span class="c1">// this method to test an empty list.  In this case, we assume that the</span>
<span class="w">		</span><span class="c1">// subclass receive pack properly enforces push restrictions. for the</span>
<span class="w">		</span><span class="c1">// ref.</span>
<span class="w">		</span><span class="c1">//</span>
<span class="w">		</span><span class="c1">// The empty test is not explicitly required, it&#39;s written here to</span>
<span class="w">		</span><span class="c1">// clarify special-case behavior.</span>

<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">commands</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">()</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">canPush</span><span class="p">(</span><span class="n">repository</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * Instrumentation point where the incoming push event has been parsed,</span>
<span class="cm">	 * validated, objects created BUT refs have not been updated. You might</span>
<span class="cm">	 * use this to enforce a branch-write permissions model.</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">onPreReceive</span><span class="p">(</span><span class="n">ReceivePack</span><span class="w"> </span><span class="n">rp</span><span class="p">,</span><span class="w"> </span><span class="n">Collection</span><span class="o">&lt;</span><span class="n">ReceiveCommand</span><span class="o">&gt;</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">commands</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// no receive commands to process</span>
<span class="w">			</span><span class="c1">// this can happen if receive pack subclasses intercept and filter</span>
<span class="w">			</span><span class="c1">// the commands</span>
<span class="w">			</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">debug</span><span class="p">(</span><span class="s">&quot;skipping pre-receive processing, no refs created, updated, or removed&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">isMirror</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// repository is a mirror</span>
<span class="w">			</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Gitblit does not allow pushes to \&quot;{0}\&quot; because it is a mirror!&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">isFrozen</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// repository is frozen/readonly</span>
<span class="w">			</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Gitblit does not allow pushes to \&quot;{0}\&quot; because it is frozen!&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">repository</span><span class="p">.</span><span class="na">isBare</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// repository has a working copy</span>
<span class="w">			</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Gitblit does not allow pushes to \&quot;{0}\&quot; because it has a working copy!&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">canPush</span><span class="p">(</span><span class="n">commands</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// user does not have push permissions</span>
<span class="w">			</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;User \&quot;{0}\&quot; does not have push permissions for \&quot;{1}\&quot;!&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">accessRestriction</span><span class="p">.</span><span class="na">atLeast</span><span class="p">(</span><span class="n">AccessRestrictionType</span><span class="p">.</span><span class="na">PUSH</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">verifyCommitter</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// enforce committer verification</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">StringUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="na">emailAddress</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// reject the push because the pushing account does not have an email address</span>
<span class="w">				</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Sorry, the account \&quot;{0}\&quot; does not have an email address set for committer verification!&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">			</span><span class="c1">// Optionally enforce that the committer of first parent chain</span>
<span class="w">			</span><span class="c1">// match the account being used to push the commits.</span>
<span class="w">			</span><span class="c1">//</span>
<span class="w">			</span><span class="c1">// This requires all merge commits are executed with the &quot;--no-ff&quot;</span>
<span class="w">			</span><span class="c1">// option to force a merge commit even if fast-forward is possible.</span>
<span class="w">			</span><span class="c1">// This ensures that the chain first parents has the commit</span>
<span class="w">			</span><span class="c1">// identity of the merging user.</span>
<span class="w">			</span><span class="kt">boolean</span><span class="w"> </span><span class="n">allRejected</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">			</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">String</span><span class="w"> </span><span class="n">firstParent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">				</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">List</span><span class="o">&lt;</span><span class="n">RevCommit</span><span class="o">&gt;</span><span class="w"> </span><span class="n">commits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JGitUtils</span><span class="p">.</span><span class="na">getRevLog</span><span class="p">(</span><span class="n">rp</span><span class="p">.</span><span class="na">getRepository</span><span class="p">(),</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getOldId</span><span class="p">().</span><span class="na">name</span><span class="p">(),</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getNewId</span><span class="p">().</span><span class="na">name</span><span class="p">());</span>
<span class="w">					</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">RevCommit</span><span class="w"> </span><span class="n">commit</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commits</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>

<span class="w">						</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstParent</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		            		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">commit</span><span class="p">.</span><span class="na">getName</span><span class="p">().</span><span class="na">equals</span><span class="p">(</span><span class="n">firstParent</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">		            			</span><span class="c1">// ignore: commit is right-descendant of a merge</span>
<span class="w">		            			</span><span class="k">continue</span><span class="p">;</span>
<span class="w">		            		</span><span class="p">}</span>
<span class="w">		            	</span><span class="p">}</span>

<span class="w">						</span><span class="c1">// update expected next commit id</span>
<span class="w">						</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">commit</span><span class="p">.</span><span class="na">getParentCount</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		                	</span><span class="n">firstParent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">						</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">							</span><span class="n">firstParent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">commit</span><span class="p">.</span><span class="na">getParents</span><span class="p">()</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">.</span><span class="na">getId</span><span class="p">().</span><span class="na">getName</span><span class="p">();</span>
<span class="w">						</span><span class="p">}</span>

<span class="w">						</span><span class="n">PersonIdent</span><span class="w"> </span><span class="n">committer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">commit</span><span class="p">.</span><span class="na">getCommitterIdent</span><span class="p">();</span>
<span class="w">						</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">user</span><span class="p">.</span><span class="na">is</span><span class="p">(</span><span class="n">committer</span><span class="p">.</span><span class="na">getName</span><span class="p">(),</span><span class="w"> </span><span class="n">committer</span><span class="p">.</span><span class="na">getEmailAddress</span><span class="p">()))</span><span class="w"> </span><span class="p">{</span>
<span class="w">							</span><span class="c1">// verification failed</span>
<span class="w">							</span><span class="n">String</span><span class="w"> </span><span class="n">reason</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} by {1} &lt;{2}&gt; was not committed by {3} ({4}) &lt;{5}&gt;&quot;</span><span class="p">,</span>
<span class="w">									</span><span class="n">commit</span><span class="p">.</span><span class="na">getId</span><span class="p">().</span><span class="na">name</span><span class="p">(),</span><span class="w"> </span><span class="n">committer</span><span class="p">.</span><span class="na">getName</span><span class="p">(),</span><span class="w"> </span><span class="n">StringUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">committer</span><span class="p">.</span><span class="na">getEmailAddress</span><span class="p">())</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s">&quot;?&quot;</span><span class="p">:</span><span class="n">committer</span><span class="p">.</span><span class="na">getEmailAddress</span><span class="p">(),</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">getDisplayName</span><span class="p">(),</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">emailAddress</span><span class="p">);</span>
<span class="w">							</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">warn</span><span class="p">(</span><span class="n">reason</span><span class="p">);</span>
<span class="w">							</span><span class="n">cmd</span><span class="p">.</span><span class="na">setResult</span><span class="p">(</span><span class="n">Result</span><span class="p">.</span><span class="na">REJECTED_OTHER_REASON</span><span class="p">,</span><span class="w"> </span><span class="n">reason</span><span class="p">);</span>
<span class="w">							</span><span class="n">allRejected</span><span class="w"> </span><span class="o">&amp;=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">							</span><span class="k">break</span><span class="p">;</span>
<span class="w">						</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">							</span><span class="n">allRejected</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">						</span><span class="p">}</span>
<span class="w">					</span><span class="p">}</span>
<span class="w">				</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="s">&quot;Failed to verify commits were made by pushing user&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">allRejected</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// all ref updates rejected, abort</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">String</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">();</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ref</span><span class="p">.</span><span class="na">startsWith</span><span class="p">(</span><span class="n">Constants</span><span class="p">.</span><span class="na">R_HEADS</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getType</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">case</span><span class="w"> </span><span class="n">UPDATE_NONFASTFORWARD</span><span class="p">:</span>
<span class="w">				</span><span class="k">case</span><span class="w"> </span><span class="n">DELETE</span><span class="p">:</span>
<span class="w">					</span><span class="c1">// reset branch commit cache on REWIND and DELETE</span>
<span class="w">					</span><span class="n">CommitCache</span><span class="p">.</span><span class="na">instance</span><span class="p">().</span><span class="na">clear</span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">,</span><span class="w"> </span><span class="n">ref</span><span class="p">);</span>
<span class="w">					</span><span class="k">break</span><span class="p">;</span>
<span class="w">				</span><span class="k">default</span><span class="p">:</span>
<span class="w">					</span><span class="k">break</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ref</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">BranchTicketService</span><span class="p">.</span><span class="na">BRANCH</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// ensure pushing user is an administrator OR an owner</span>
<span class="w">				</span><span class="c1">// i.e. prevent ticket tampering</span>
<span class="w">				</span><span class="kt">boolean</span><span class="w"> </span><span class="n">permitted</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">canAdmin</span><span class="p">()</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">isOwner</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">);</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">permitted</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;{0} is not permitted to push to {1}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">,</span><span class="w"> </span><span class="n">ref</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ref</span><span class="p">.</span><span class="na">startsWith</span><span class="p">(</span><span class="n">Constants</span><span class="p">.</span><span class="na">R_FOR</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// prevent accidental push to refs/for</span>
<span class="w">				</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;{0} is not configured to receive patchsets&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="c1">// call pre-receive plugins</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveHook</span><span class="w"> </span><span class="n">hook</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">gitblit</span><span class="p">.</span><span class="na">getExtensions</span><span class="p">(</span><span class="n">ReceiveHook</span><span class="p">.</span><span class="na">class</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">hook</span><span class="p">.</span><span class="na">onPreReceive</span><span class="p">(</span><span class="k">this</span><span class="p">,</span><span class="w"> </span><span class="n">commands</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="s">&quot;Failed to execute extension&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">scripts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">LinkedHashSet</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="p">();</span>
<span class="w">		</span><span class="n">scripts</span><span class="p">.</span><span class="na">addAll</span><span class="p">(</span><span class="n">gitblit</span><span class="p">.</span><span class="na">getPreReceiveScriptsInherited</span><span class="p">(</span><span class="n">repository</span><span class="p">));</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ArrayUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">preReceiveScripts</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">scripts</span><span class="p">.</span><span class="na">addAll</span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">preReceiveScripts</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="n">runGroovy</span><span class="p">(</span><span class="n">commands</span><span class="p">,</span><span class="w"> </span><span class="n">scripts</span><span class="p">);</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">Result</span><span class="p">.</span><span class="na">NOT_ATTEMPTED</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getResult</span><span class="p">()))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">warn</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} {1} because \&quot;{2}\&quot;&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getNewId</span><span class="p">()</span>
<span class="w">						</span><span class="p">.</span><span class="na">getName</span><span class="p">(),</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getResult</span><span class="p">(),</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getMessage</span><span class="p">()));</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * Instrumentation point where the incoming push has been applied to the</span>
<span class="cm">	 * repository. This is the point where we would trigger a Jenkins build</span>
<span class="cm">	 * or send an email.</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">onPostReceive</span><span class="p">(</span><span class="n">ReceivePack</span><span class="w"> </span><span class="n">rp</span><span class="p">,</span><span class="w"> </span><span class="n">Collection</span><span class="o">&lt;</span><span class="n">ReceiveCommand</span><span class="o">&gt;</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">commands</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">debug</span><span class="p">(</span><span class="s">&quot;skipping post-receive processing, no refs created, updated, or removed&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="kt">boolean</span><span class="w"> </span><span class="n">isRefCreationOrDeletion</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>

<span class="w">		</span><span class="c1">// log ref changes</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>

<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">Result</span><span class="p">.</span><span class="na">OK</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getResult</span><span class="p">()))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// add some logging for important ref changes</span>
<span class="w">				</span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getType</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">case</span><span class="w"> </span><span class="n">DELETE</span><span class="p">:</span>
<span class="w">					</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} DELETED {1} in {2} ({3})&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">(),</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getOldId</span><span class="p">().</span><span class="na">name</span><span class="p">()));</span>
<span class="w">					</span><span class="n">isRefCreationOrDeletion</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">					</span><span class="k">break</span><span class="p">;</span>
<span class="w">				</span><span class="k">case</span><span class="w"> </span><span class="n">CREATE</span><span class="p">:</span>
<span class="w">					</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} CREATED {1} in {2}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">(),</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">));</span>
<span class="w">					</span><span class="n">isRefCreationOrDeletion</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">					</span><span class="k">break</span><span class="p">;</span>
<span class="w">				</span><span class="k">case</span><span class="w"> </span><span class="n">UPDATE</span><span class="p">:</span>
<span class="w">					</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} UPDATED {1} in {2} (from {3} to {4})&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">(),</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getOldId</span><span class="p">().</span><span class="na">name</span><span class="p">(),</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getNewId</span><span class="p">().</span><span class="na">name</span><span class="p">()));</span>
<span class="w">					</span><span class="k">break</span><span class="p">;</span>
<span class="w">				</span><span class="k">case</span><span class="w"> </span><span class="n">UPDATE_NONFASTFORWARD</span><span class="p">:</span>
<span class="w">					</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} UPDATED NON-FAST-FORWARD {1} in {2} (from {3} to {4})&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">(),</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getOldId</span><span class="p">().</span><span class="na">name</span><span class="p">(),</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getNewId</span><span class="p">().</span><span class="na">name</span><span class="p">()));</span>
<span class="w">					</span><span class="k">break</span><span class="p">;</span>
<span class="w">				</span><span class="k">default</span><span class="p">:</span>
<span class="w">					</span><span class="k">break</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isRefCreationOrDeletion</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">gitblit</span><span class="p">.</span><span class="na">resetRepositoryCache</span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">useIncrementalPushTags</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// tag each pushed branch tip</span>
<span class="w">			</span><span class="n">String</span><span class="w"> </span><span class="n">emailAddress</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">emailAddress</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">rp</span><span class="p">.</span><span class="na">getRefLogIdent</span><span class="p">().</span><span class="na">getEmailAddress</span><span class="p">()</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">emailAddress</span><span class="p">;</span>
<span class="w">			</span><span class="n">PersonIdent</span><span class="w"> </span><span class="n">userIdent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">PersonIdent</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="na">getDisplayName</span><span class="p">(),</span><span class="w"> </span><span class="n">emailAddress</span><span class="p">);</span>

<span class="w">			</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">().</span><span class="na">startsWith</span><span class="p">(</span><span class="n">Constants</span><span class="p">.</span><span class="na">R_HEADS</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="c1">// only tag branch ref changes</span>
<span class="w">					</span><span class="k">continue</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>

<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ReceiveCommand</span><span class="p">.</span><span class="na">Type</span><span class="p">.</span><span class="na">DELETE</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getType</span><span class="p">())</span>
<span class="w">						</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">ReceiveCommand</span><span class="p">.</span><span class="na">Result</span><span class="p">.</span><span class="na">OK</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getResult</span><span class="p">()))</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">String</span><span class="w"> </span><span class="n">objectId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getNewId</span><span class="p">().</span><span class="na">getName</span><span class="p">();</span>
<span class="w">					</span><span class="n">String</span><span class="w"> </span><span class="n">branch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">().</span><span class="na">substring</span><span class="p">(</span><span class="n">Constants</span><span class="p">.</span><span class="na">R_HEADS</span><span class="p">.</span><span class="na">length</span><span class="p">());</span>
<span class="w">					</span><span class="c1">// get translation based on the server&#39;s locale setting</span>
<span class="w">					</span><span class="n">String</span><span class="w"> </span><span class="n">template</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Translation</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&quot;gb.incrementalPushTagMessage&quot;</span><span class="p">);</span>
<span class="w">					</span><span class="n">String</span><span class="w"> </span><span class="n">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="n">template</span><span class="p">,</span><span class="w"> </span><span class="n">branch</span><span class="p">);</span>
<span class="w">					</span><span class="n">String</span><span class="w"> </span><span class="n">prefix</span><span class="p">;</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">StringUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">incrementalPushTagPrefix</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">prefix</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">settings</span><span class="p">.</span><span class="na">getString</span><span class="p">(</span><span class="n">Keys</span><span class="p">.</span><span class="na">git</span><span class="p">.</span><span class="na">defaultIncrementalPushTagPrefix</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;r&quot;</span><span class="p">);</span>
<span class="w">					</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">prefix</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">incrementalPushTagPrefix</span><span class="p">;</span>
<span class="w">					</span><span class="p">}</span>

<span class="w">					</span><span class="n">JGitUtils</span><span class="p">.</span><span class="na">createIncrementalRevisionTag</span><span class="p">(</span>
<span class="w">							</span><span class="n">rp</span><span class="p">.</span><span class="na">getRepository</span><span class="p">(),</span>
<span class="w">							</span><span class="n">objectId</span><span class="p">,</span>
<span class="w">							</span><span class="n">userIdent</span><span class="p">,</span>
<span class="w">							</span><span class="n">prefix</span><span class="p">,</span>
<span class="w">							</span><span class="s">&quot;0&quot;</span><span class="p">,</span>
<span class="w">							</span><span class="n">msg</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="c1">// update push log</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">RefLogUtils</span><span class="p">.</span><span class="na">updateRefLog</span><span class="p">(</span><span class="n">user</span><span class="p">,</span><span class="w"> </span><span class="n">rp</span><span class="p">.</span><span class="na">getRepository</span><span class="p">(),</span><span class="w"> </span><span class="n">commands</span><span class="p">);</span>
<span class="w">			</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">debug</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} push log updated&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">));</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;Failed to update {0} pushlog&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">.</span><span class="na">name</span><span class="p">),</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="c1">// check for updates pushed to the BranchTicketService branch</span>
<span class="w">		</span><span class="c1">// if the BranchTicketService is active it will reindex, as appropriate</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">commands</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">Result</span><span class="p">.</span><span class="na">OK</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getResult</span><span class="p">())</span>
<span class="w">					</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">BranchTicketService</span><span class="p">.</span><span class="na">BRANCH</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getRefName</span><span class="p">()))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">rp</span><span class="p">.</span><span class="na">getRepository</span><span class="p">().</span><span class="na">fireEvent</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ReceiveCommandEvent</span><span class="p">(</span><span class="n">repository</span><span class="p">,</span><span class="w"> </span><span class="n">cmd</span><span class="p">));</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="c1">// call post-receive plugins</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveHook</span><span class="w"> </span><span class="n">hook</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">gitblit</span><span class="p">.</span><span class="na">getExtensions</span><span class="p">(</span><span class="n">ReceiveHook</span><span class="p">.</span><span class="na">class</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">hook</span><span class="p">.</span><span class="na">onPostReceive</span><span class="p">(</span><span class="k">this</span><span class="p">,</span><span class="w"> </span><span class="n">commands</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="s">&quot;Failed to execute extension&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="c1">// run Groovy hook scripts</span>
<span class="w">		</span><span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">scripts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">LinkedHashSet</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="p">();</span>
<span class="w">		</span><span class="n">scripts</span><span class="p">.</span><span class="na">addAll</span><span class="p">(</span><span class="n">gitblit</span><span class="p">.</span><span class="na">getPostReceiveScriptsInherited</span><span class="p">(</span><span class="n">repository</span><span class="p">));</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ArrayUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">postReceiveScripts</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">scripts</span><span class="p">.</span><span class="na">addAll</span><span class="p">(</span><span class="n">repository</span><span class="p">.</span><span class="na">postReceiveScripts</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="n">runGroovy</span><span class="p">(</span><span class="n">commands</span><span class="p">,</span><span class="w"> </span><span class="n">scripts</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/** Execute commands to update references. */</span>
<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">executeCommands</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">List</span><span class="o">&lt;</span><span class="n">ReceiveCommand</span><span class="o">&gt;</span><span class="w"> </span><span class="n">toApply</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">filterCommands</span><span class="p">(</span><span class="n">Result</span><span class="p">.</span><span class="na">NOT_ATTEMPTED</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">toApply</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="n">ProgressMonitor</span><span class="w"> </span><span class="n">updating</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">NullProgressMonitor</span><span class="p">.</span><span class="na">INSTANCE</span><span class="p">;</span>
<span class="w">		</span><span class="kt">boolean</span><span class="w"> </span><span class="n">sideBand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">isCapabilityEnabled</span><span class="p">(</span><span class="n">CAPABILITY_SIDE_BAND_64K</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sideBand</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">SideBandProgressMonitor</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">SideBandProgressMonitor</span><span class="p">(</span><span class="n">msgOut</span><span class="p">);</span>
<span class="w">			</span><span class="n">pm</span><span class="p">.</span><span class="na">setDelayStart</span><span class="p">(</span><span class="mi">250</span><span class="p">,</span><span class="w"> </span><span class="n">TimeUnit</span><span class="p">.</span><span class="na">MILLISECONDS</span><span class="p">);</span>
<span class="w">			</span><span class="n">updating</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pm</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="n">BatchRefUpdate</span><span class="w"> </span><span class="n">batch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getRepository</span><span class="p">().</span><span class="na">getRefDatabase</span><span class="p">().</span><span class="na">newBatchUpdate</span><span class="p">();</span>
<span class="w">		</span><span class="n">batch</span><span class="p">.</span><span class="na">setAllowNonFastForwards</span><span class="p">(</span><span class="n">isAllowNonFastForwards</span><span class="p">());</span>
<span class="w">		</span><span class="n">batch</span><span class="p">.</span><span class="na">setRefLogIdent</span><span class="p">(</span><span class="n">getRefLogIdent</span><span class="p">());</span>
<span class="w">		</span><span class="n">batch</span><span class="p">.</span><span class="na">setRefLogMessage</span><span class="p">(</span><span class="s">&quot;push&quot;</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">);</span>

<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">toApply</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">Result</span><span class="p">.</span><span class="na">NOT_ATTEMPTED</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">cmd</span><span class="p">.</span><span class="na">getResult</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// Already rejected by the core receive process.</span>
<span class="w">				</span><span class="k">continue</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">batch</span><span class="p">.</span><span class="na">addCommand</span><span class="p">(</span><span class="n">cmd</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">batch</span><span class="p">.</span><span class="na">getCommands</span><span class="p">().</span><span class="na">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">batch</span><span class="p">.</span><span class="na">execute</span><span class="p">(</span><span class="n">getRevWalk</span><span class="p">(),</span><span class="w"> </span><span class="n">updating</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">IOException</span><span class="w"> </span><span class="n">err</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">toApply</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">cmd</span><span class="p">.</span><span class="na">getResult</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Result</span><span class="p">.</span><span class="na">NOT_ATTEMPTED</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">sendRejection</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;lock error: {0}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">err</span><span class="p">.</span><span class="na">getMessage</span><span class="p">());</span>
<span class="w">					</span><span class="p">}</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setGitblitUrl</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">url</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">this</span><span class="p">.</span><span class="na">gitblitUrl</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">url</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">sendRejection</span><span class="p">(</span><span class="kd">final</span><span class="w"> </span><span class="n">ReceiveCommand</span><span class="w"> </span><span class="n">cmd</span><span class="p">,</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">why</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="p">...</span><span class="w"> </span><span class="n">objects</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">String</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ArrayUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">objects</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">why</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="n">why</span><span class="p">,</span><span class="w"> </span><span class="n">objects</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="n">cmd</span><span class="p">.</span><span class="na">setResult</span><span class="p">(</span><span class="n">Result</span><span class="p">.</span><span class="na">REJECTED_OTHER_REASON</span><span class="p">,</span><span class="w"> </span><span class="n">text</span><span class="p">);</span>
<span class="w">		</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">text</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot; (&quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot;)&quot;</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">sendHeader</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="p">...</span><span class="w"> </span><span class="n">objects</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">sendInfo</span><span class="p">(</span><span class="s">&quot;--&gt; &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">objects</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">sendInfo</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="p">...</span><span class="w"> </span><span class="n">objects</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">sendInfo</span><span class="p">(</span><span class="s">&quot;    &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">objects</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">sendInfo</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">prefix</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="p">...</span><span class="w"> </span><span class="n">objects</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">String</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ArrayUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">objects</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">msg</span><span class="p">;</span>
<span class="w">			</span><span class="kd">super</span><span class="p">.</span><span class="na">sendMessage</span><span class="p">(</span><span class="n">prefix</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">msg</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">objects</span><span class="p">);</span>
<span class="w">			</span><span class="kd">super</span><span class="p">.</span><span class="na">sendMessage</span><span class="p">(</span><span class="n">prefix</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">text</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">StringUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="n">text</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot; (&quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot;)&quot;</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">sendError</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="p">...</span><span class="w"> </span><span class="n">objects</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">String</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ArrayUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">objects</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">msg</span><span class="p">;</span>
<span class="w">			</span><span class="kd">super</span><span class="p">.</span><span class="na">sendError</span><span class="p">(</span><span class="n">msg</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span><span class="w"> </span><span class="n">objects</span><span class="p">);</span>
<span class="w">			</span><span class="kd">super</span><span class="p">.</span><span class="na">sendError</span><span class="p">(</span><span class="n">text</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">StringUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">text</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot; (&quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">user</span><span class="p">.</span><span class="na">username</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot;)&quot;</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * Runs the specified Groovy hook scripts.</span>
<span class="cm">	 *</span>
<span class="cm">	 * @param repository</span>
<span class="cm">	 * @param user</span>
<span class="cm">	 * @param commands</span>
<span class="cm">	 * @param scripts</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">runGroovy</span><span class="p">(</span><span class="n">Collection</span><span class="o">&lt;</span><span class="n">ReceiveCommand</span><span class="o">&gt;</span><span class="w"> </span><span class="n">commands</span><span class="p">,</span><span class="w"> </span><span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">scripts</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">scripts</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">scripts</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// no Groovy scripts to execute</span>
<span class="w">			</span><span class="k">return</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="n">Binding</span><span class="w"> </span><span class="n">binding</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Binding</span><span class="p">();</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;gitblit&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">gitblit</span><span class="p">);</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;repository&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">repository</span><span class="p">);</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;receivePack&quot;</span><span class="p">,</span><span class="w"> </span><span class="k">this</span><span class="p">);</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;user&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">);</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;commands&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">commands</span><span class="p">);</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;url&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">gitblitUrl</span><span class="p">);</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;logger&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">LOGGER</span><span class="p">);</span>
<span class="w">		</span><span class="n">binding</span><span class="p">.</span><span class="na">setVariable</span><span class="p">(</span><span class="s">&quot;clientLogger&quot;</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ClientLogger</span><span class="p">(</span><span class="k">this</span><span class="p">));</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">script</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">scripts</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">StringUtils</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">(</span><span class="n">script</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">continue</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="c1">// allow script to be specified without .groovy extension</span>
<span class="w">			</span><span class="c1">// this is easier to read in the settings</span>
<span class="w">			</span><span class="n">File</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">File</span><span class="p">(</span><span class="n">groovyDir</span><span class="p">,</span><span class="w"> </span><span class="n">script</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">file</span><span class="p">.</span><span class="na">exists</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">!</span><span class="n">script</span><span class="p">.</span><span class="na">toLowerCase</span><span class="p">().</span><span class="na">endsWith</span><span class="p">(</span><span class="s">&quot;.groovy&quot;</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">File</span><span class="p">(</span><span class="n">groovyDir</span><span class="p">,</span><span class="w"> </span><span class="n">script</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot;.groovy&quot;</span><span class="p">);</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">file</span><span class="p">.</span><span class="na">exists</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">script</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">file</span><span class="p">.</span><span class="na">getName</span><span class="p">();</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">Object</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gse</span><span class="p">.</span><span class="na">run</span><span class="p">(</span><span class="n">script</span><span class="p">,</span><span class="w"> </span><span class="n">binding</span><span class="p">);</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">result</span><span class="w"> </span><span class="k">instanceof</span><span class="w"> </span><span class="n">Boolean</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">((</span><span class="n">Boolean</span><span class="p">)</span><span class="w"> </span><span class="n">result</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span>
<span class="w">								</span><span class="s">&quot;Groovy script {0} has failed!  Hook scripts aborted.&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">script</span><span class="p">));</span>
<span class="w">						</span><span class="k">break</span><span class="p">;</span>
<span class="w">					</span><span class="p">}</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">LOGGER</span><span class="p">.</span><span class="na">error</span><span class="p">(</span>
<span class="w">						</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;Failed to execute Groovy script {0}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">script</span><span class="p">),</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">IGitblit</span><span class="w"> </span><span class="nf">getGitblit</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">gitblit</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">RepositoryModel</span><span class="w"> </span><span class="nf">getRepositoryModel</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">repository</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">UserModel</span><span class="w"> </span><span class="nf">getUserModel</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">user</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2025-08-10 22:43:48 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
