Merge "Fix broken links in error documentation"
diff --git a/ReleaseNotes/ReleaseNotes-2.1.7.txt b/ReleaseNotes/ReleaseNotes-2.1.7.txt
index 58aa584..d4088c9 100644
--- a/ReleaseNotes/ReleaseNotes-2.1.7.txt
+++ b/ReleaseNotes/ReleaseNotes-2.1.7.txt
@@ -138,10 +138,9 @@
 * Internal dependencies updated
 +
 Updated H2 Database to 1.2.147, PostgreSQL JDBC Client to 9.0-801,
-ANTLR to 3.2, GWT to 2.1.1, JSch to 0.1.44, Gson to 1.6, Ehcache to
-2.3.0, Apache Commons Net to 2.2, Apache Commons Pool to 1.5.5, JGit
-to 0.11.3.240-gd05d351, MINA SSHD to 0.5.1-r1095809, Jetty to
-7.4.0.v20110414.
+ANTLR to 3.2, GWT to 2.1.1, JSch to 0.1.44, Gson to 1.6, Apache
+Commons Net to 2.2, Apache Commons Pool to 1.5.5, JGit to
+0.11.3.240-gd05d351, MINA SSHD to 0.5.1-r1095809.
 
 Bug Fixes
 ---------
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/gerrit.sh b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/gerrit.sh
index 60f56a8..9aba73e 100755
--- a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/gerrit.sh
+++ b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/gerrit.sh
@@ -47,7 +47,7 @@
 ##################################################
 running() {
   test -f $1 || return 1
-  PID=$(cat $1)
+  PID=`cat $1`
   ps -p $PID >/dev/null 2>/dev/null || return 1
   return 0
 }
@@ -203,7 +203,7 @@
 # Check that Gerrit is where we think it is
 #####################################################
 GERRIT_CONFIG="$GERRIT_SITE/$GERRIT_INSTALL_TRACE_FILE"
-test -e "$GERRIT_CONFIG" || {
+test -f "$GERRIT_CONFIG" || {
    echo "** ERROR: Gerrit is not initialized in $GERRIT_SITE"
    exit 1
 }
@@ -309,12 +309,12 @@
 ulimit -c 0            ; # core file size
 ulimit -d unlimited    ; # data seg size
 ulimit -f unlimited    ; # file size
-ulimit -m unlimited    ; # max memory size
+ulimit -m >/dev/null 2>&1 && ulimit -m unlimited  ; # max memory size
 ulimit -n $GERRIT_FDS  ; # open files
 ulimit -t unlimited    ; # cpu time
-ulimit -t unlimited    ; # virtual memory
+ulimit -v unlimited    ; # virtual memory
 
-ulimit -x unlimited    2>/dev/null ; # file locks
+ulimit -x >/dev/null 2>&1 && ulimit -x unlimited  ; # file locks
 
 #####################################################
 # This is how the Gerrit server will be started
@@ -344,7 +344,7 @@
   exit 1
 fi
 
-test -z "$GERRIT_USER" && GERRIT_USER=$(whoami)
+test -z "$GERRIT_USER" && GERRIT_USER=`whoami`
 RUN_ARGS="-jar $GERRIT_WAR daemon -d $GERRIT_SITE"
 if test "`get_config --bool container.slave`" = "true" ; then
   RUN_ARGS="$RUN_ARGS --slave"
@@ -381,9 +381,9 @@
       exit 0
     fi
 
-    test -z "$UID" && UID=`id -u`
+    test -z "$UID" && UID=`id | sed -e 's/^[^=]*=\([0-9]*\).*/\1/'`
 
-    RUN_ID=$(date +%s).$$
+    RUN_ID=`date +%s`.$$
     RUN_ARGS="$RUN_ARGS --run-id=$RUN_ID"
 
     if test 1 = "$START_STOP_DAEMON" && type start-stop-daemon >/dev/null 2>&1
@@ -425,7 +425,7 @@
       else
         $RUN_EXEC $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS &
         PID=$!
-        disown $PID
+        type disown >/dev/null 2>&1 && disown $PID
         echo $PID >"$GERRIT_PID"
       fi
     fi
@@ -444,13 +444,13 @@
     TIMEOUT=90  # seconds
     sleep 1
     while running "$GERRIT_PID" && test $TIMEOUT -gt 0 ; do
-      if test "x$RUN_ID" = "x$(cat $GERRIT_RUN 2>/dev/null)" ; then
+      if test "x$RUN_ID" = "x`cat $GERRIT_RUN 2>/dev/null`" ; then
         echo OK
         exit 0
       fi
 
       sleep 2
-      TIMEOUT=$(($TIMEOUT - 2))
+      TIMEOUT=`expr $TIMEOUT - 2`
     done
 
     echo FAILED
@@ -481,7 +481,7 @@
       while running "$GERRIT_PID" && test $TIMEOUT -gt 0 ; do
         kill $PID 2>/dev/null
         sleep 1
-        TIMEOUT=$(($TIMEOUT - 1))
+        TIMEOUT=`expr $TIMEOUT - 1`
       done
       test $TIMEOUT -gt 0 || kill -9 $PID 2>/dev/null
       rm -f "$GERRIT_PID" "$GERRIT_RUN"
@@ -491,7 +491,9 @@
 
   restart)
     GERRIT_SH=$0
-    if ! test -f "$GERRIT_SH" ; then
+    if test -f "$GERRIT_SH" ; then
+      : OK
+    else
       echo >&2 "** ERROR: Cannot locate gerrit.sh"
       exit 1
     fi
diff --git a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/index_postgres.sql b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/index_postgres.sql
index cb8196e..8e3cead 100644
--- a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/index_postgres.sql
+++ b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/index_postgres.sql
@@ -13,9 +13,42 @@
 CLUSTER;
 
 
+-- Define function for conditional installation of PL/pgSQL.
+-- This is required, because starting with PostgreSQL 9.0, PL/pgSQL
+-- language is installed by default and database returns error when
+-- we try to install it again.
+--
+-- Source: http://wiki.postgresql.org/wiki/CREATE_OR_REPLACE_LANGUAGE
+-- Author: David Fetter
+--
+
+delimiter //
+
+CREATE OR REPLACE FUNCTION make_plpgsql()
+RETURNS VOID
+LANGUAGE SQL
+AS $$
+CREATE LANGUAGE plpgsql;
+$$;
+
+//
+
+delimiter ;
+
+SELECT
+    CASE
+    WHEN EXISTS(
+        SELECT 1
+        FROM pg_catalog.pg_language
+        WHERE lanname='plpgsql'
+    )
+    THEN NULL
+    ELSE make_plpgsql() END;
+
+DROP FUNCTION make_plpgsql();
+
 -- Define our schema upgrade support function.
 --
-CREATE LANGUAGE plpgsql;
 
 delimiter //
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CachePool.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CachePool.java
index 2e812014..5230ff6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CachePool.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CachePool.java
@@ -22,6 +22,7 @@
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
+import com.google.inject.ProvisionException;
 import com.google.inject.Singleton;
 
 import net.sf.ehcache.CacheManager;
@@ -142,12 +143,9 @@
 
         c.setMaxElementsInMemory(getInt(name, "memorylimit", p.memoryLimit()));
 
-        long ttl = getSeconds(name, "maxage", p.maxAge());
-        c.setEternal(ttl == 0);
-        if (ttl != 0) {
-          c.setTimeToIdleSeconds(0);
-          c.setTimeToLiveSeconds(ttl);
-        }
+        c.setTimeToIdleSeconds(0);
+        c.setTimeToLiveSeconds(getSeconds(name, "maxage", p.maxAge()));
+        c.setEternal(c.getTimeToLiveSeconds() == 0);
 
         if (p.disk() && mgr.getDiskStoreConfiguration() != null) {
           c.setMaxElementsOnDisk(getInt(name, "disklimit", p.diskLimit()));
@@ -222,6 +220,8 @@
       c.setMaxElementsInMemory(1024);
       c.setMemoryStoreEvictionPolicyFromObject(MemoryStoreEvictionPolicy.LFU);
 
+      c.setTimeToIdleSeconds(0);
+      c.setTimeToLiveSeconds(0 /* infinite */);
       c.setEternal(true);
 
       if (mgr.getDiskStoreConfiguration() != null) {
@@ -237,10 +237,14 @@
     }
 
     private CacheConfiguration newCache(final String name) {
-      final CacheConfiguration c;
-      c = mgr.getDefaultCacheConfiguration().clone();
-      c.setName(name);
-      return c;
+      try {
+        final CacheConfiguration c;
+        c = mgr.getDefaultCacheConfiguration().clone();
+        c.setName(name);
+        return c;
+      } catch (CloneNotSupportedException e) {
+        throw new ProvisionException("Cannot configure cache " + name, e);
+      }
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/ProxyEhcache.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/ProxyEhcache.java
index 2568cb3..8b3179a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/ProxyEhcache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/ProxyEhcache.java
@@ -29,11 +29,7 @@
 import net.sf.ehcache.statistics.CacheUsageListener;
 import net.sf.ehcache.statistics.LiveCacheStatistics;
 import net.sf.ehcache.statistics.sampled.SampledCacheStatistics;
-import net.sf.ehcache.transaction.manager.TransactionManagerLookup;
-import net.sf.ehcache.writer.CacheWriter;
-import net.sf.ehcache.writer.CacheWriterManager;
 
-import java.beans.PropertyChangeListener;
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
@@ -74,66 +70,55 @@
   //
   // Everything else delegates through self.
   //
-  @Override
+
   public void bootstrap() {
     self().bootstrap();
   }
 
-  @Override
   public long calculateInMemorySize() throws IllegalStateException,
       CacheException {
     return self().calculateInMemorySize();
   }
 
-  @Override
   public void clearStatistics() {
     self().clearStatistics();
   }
 
-  @Override
   public void dispose() throws IllegalStateException {
     self().dispose();
   }
 
-  @Override
   public void evictExpiredElements() {
     self().evictExpiredElements();
   }
 
-  @Override
   public void flush() throws IllegalStateException, CacheException {
     self().flush();
   }
 
-  @Override
   public Element get(Object key) throws IllegalStateException, CacheException {
     return self().get(key);
   }
 
-  @Override
   public Element get(Serializable key) throws IllegalStateException,
       CacheException {
     return self().get(key);
   }
 
   @SuppressWarnings("unchecked")
-  @Override
   public Map getAllWithLoader(Collection keys, Object loaderArgument)
       throws CacheException {
     return self().getAllWithLoader(keys, loaderArgument);
   }
 
-  @Override
   public float getAverageGetTime() {
     return self().getAverageGetTime();
   }
 
-  @Override
   public BootstrapCacheLoader getBootstrapCacheLoader() {
     return self().getBootstrapCacheLoader();
   }
 
-  @Override
   public CacheConfiguration getCacheConfiguration() {
     if (self == null) {
       // In Ehcache 1.7, BlockingCache wants to ask us if we are
@@ -146,423 +131,263 @@
     return self().getCacheConfiguration();
   }
 
-  @Override
   public RegisteredEventListeners getCacheEventNotificationService() {
     return self().getCacheEventNotificationService();
   }
 
-  @Override
   public CacheExceptionHandler getCacheExceptionHandler() {
     return self().getCacheExceptionHandler();
   }
 
-  @Override
   public CacheManager getCacheManager() {
     return self().getCacheManager();
   }
 
-  @Override
   public int getDiskStoreSize() throws IllegalStateException {
     return self().getDiskStoreSize();
   }
 
-  @Override
   public String getGuid() {
     return self().getGuid();
   }
 
   @SuppressWarnings("unchecked")
-  @Override
   public List getKeys() throws IllegalStateException, CacheException {
     return self().getKeys();
   }
 
   @SuppressWarnings("unchecked")
-  @Override
   public List getKeysNoDuplicateCheck() throws IllegalStateException {
     return self().getKeysNoDuplicateCheck();
   }
 
   @SuppressWarnings("unchecked")
-  @Override
   public List getKeysWithExpiryCheck() throws IllegalStateException,
       CacheException {
     return self().getKeysWithExpiryCheck();
   }
 
-  @Override
   public long getMemoryStoreSize() throws IllegalStateException {
     return self().getMemoryStoreSize();
   }
 
-  @Override
   public Element getQuiet(Object key) throws IllegalStateException,
       CacheException {
     return self().getQuiet(key);
   }
 
-  @Override
   public Element getQuiet(Serializable key) throws IllegalStateException,
       CacheException {
     return self().getQuiet(key);
   }
 
-  @Override
   public List<CacheExtension> getRegisteredCacheExtensions() {
     return self().getRegisteredCacheExtensions();
   }
 
-  @Override
   public List<CacheLoader> getRegisteredCacheLoaders() {
     return self().getRegisteredCacheLoaders();
   }
 
-  @Override
   public int getSize() throws IllegalStateException, CacheException {
     return self().getSize();
   }
 
-  @Override
   public Statistics getStatistics() throws IllegalStateException {
     return self().getStatistics();
   }
 
-  @Override
   public int getStatisticsAccuracy() {
     return self().getStatisticsAccuracy();
   }
 
-  @Override
   public Status getStatus() {
     return self().getStatus();
   }
 
-  @Override
   public Element getWithLoader(Object key, CacheLoader loader,
       Object loaderArgument) throws CacheException {
     return self().getWithLoader(key, loader, loaderArgument);
   }
 
-  @Override
   public void initialise() {
     self().initialise();
   }
 
-  @Override
   public boolean isDisabled() {
     return self().isDisabled();
   }
 
-  @Override
   public boolean isElementInMemory(Object key) {
     return self().isElementInMemory(key);
   }
 
-  @Override
   public boolean isElementInMemory(Serializable key) {
     return self().isElementInMemory(key);
   }
 
-  @Override
   public boolean isElementOnDisk(Object key) {
     return self().isElementOnDisk(key);
   }
 
-  @Override
   public boolean isElementOnDisk(Serializable key) {
     return self().isElementOnDisk(key);
   }
 
-  @Override
   public boolean isExpired(Element element) throws IllegalStateException,
       NullPointerException {
     return self().isExpired(element);
   }
 
-  @Override
   public boolean isKeyInCache(Object key) {
     return self().isKeyInCache(key);
   }
 
-  @Override
   public boolean isValueInCache(Object value) {
     return self().isValueInCache(value);
   }
 
-  @Override
   public void load(Object key) throws CacheException {
     self().load(key);
   }
 
   @SuppressWarnings("unchecked")
-  @Override
   public void loadAll(Collection keys, Object argument) throws CacheException {
     self().loadAll(keys, argument);
   }
 
-  @Override
   public void put(Element element, boolean doNotNotifyCacheReplicators)
       throws IllegalArgumentException, IllegalStateException, CacheException {
     self().put(element, doNotNotifyCacheReplicators);
   }
 
-  @Override
   public void put(Element element) throws IllegalArgumentException,
       IllegalStateException, CacheException {
     self().put(element);
   }
 
-  @Override
   public void putQuiet(Element element) throws IllegalArgumentException,
       IllegalStateException, CacheException {
     self().putQuiet(element);
   }
 
-  @Override
   public void registerCacheExtension(CacheExtension cacheExtension) {
     self().registerCacheExtension(cacheExtension);
   }
 
-  @Override
   public void registerCacheLoader(CacheLoader cacheLoader) {
     self().registerCacheLoader(cacheLoader);
   }
 
-  @Override
   public boolean remove(Object key, boolean doNotNotifyCacheReplicators)
       throws IllegalStateException {
     return self().remove(key, doNotNotifyCacheReplicators);
   }
 
-  @Override
   public boolean remove(Object key) throws IllegalStateException {
     return self().remove(key);
   }
 
-  @Override
   public boolean remove(Serializable key, boolean doNotNotifyCacheReplicators)
       throws IllegalStateException {
     return self().remove(key, doNotNotifyCacheReplicators);
   }
 
-  @Override
   public boolean remove(Serializable key) throws IllegalStateException {
     return self().remove(key);
   }
 
-  @Override
   public void removeAll() throws IllegalStateException, CacheException {
     self().removeAll();
   }
 
-  @Override
   public void removeAll(boolean doNotNotifyCacheReplicators)
       throws IllegalStateException, CacheException {
     self().removeAll(doNotNotifyCacheReplicators);
   }
 
-  @Override
   public boolean removeQuiet(Object key) throws IllegalStateException {
     return self().removeQuiet(key);
   }
 
-  @Override
   public boolean removeQuiet(Serializable key) throws IllegalStateException {
     return self().removeQuiet(key);
   }
 
-  @Override
   public void setBootstrapCacheLoader(BootstrapCacheLoader bootstrapCacheLoader)
       throws CacheException {
     self().setBootstrapCacheLoader(bootstrapCacheLoader);
   }
 
-  @Override
   public void setCacheExceptionHandler(
       CacheExceptionHandler cacheExceptionHandler) {
     self().setCacheExceptionHandler(cacheExceptionHandler);
   }
 
-  @Override
   public void setCacheManager(CacheManager cacheManager) {
     self().setCacheManager(cacheManager);
   }
 
-  @Override
   public void setDisabled(boolean disabled) {
     self().setDisabled(disabled);
   }
 
-  @Override
   public void setDiskStorePath(String diskStorePath) throws CacheException {
     self().setDiskStorePath(diskStorePath);
   }
 
-  @Override
   public void setStatisticsAccuracy(int statisticsAccuracy) {
     self().setStatisticsAccuracy(statisticsAccuracy);
   }
 
-  @Override
   public void unregisterCacheExtension(CacheExtension cacheExtension) {
     self().unregisterCacheExtension(cacheExtension);
   }
 
-  @Override
   public void unregisterCacheLoader(CacheLoader cacheLoader) {
     self().unregisterCacheLoader(cacheLoader);
   }
 
-  @Override
   public Object getInternalContext() {
-    return self().getInternalContext();
+    return self.getInternalContext();
   }
 
-  @Override
   public LiveCacheStatistics getLiveCacheStatistics() throws IllegalStateException {
-    return self().getLiveCacheStatistics();
+    return self.getLiveCacheStatistics();
   }
 
-  @Override
   public SampledCacheStatistics getSampledCacheStatistics() {
-    return self().getSampledCacheStatistics();
+    return self.getSampledCacheStatistics();
   }
 
-  @Override
   public int getSizeBasedOnAccuracy(int statisticsAccuracy) throws IllegalArgumentException,
       IllegalStateException, CacheException {
-    return self().getSizeBasedOnAccuracy(statisticsAccuracy);
+    return self.getSizeBasedOnAccuracy(statisticsAccuracy);
   }
 
-  @Override
   public boolean isSampledStatisticsEnabled() {
-    return self().isSampledStatisticsEnabled();
+    return self.isSampledStatisticsEnabled();
   }
 
-  @Override
   public boolean isStatisticsEnabled() {
-    return self().isStatisticsEnabled();
+    return self.isStatisticsEnabled();
   }
 
-  @Override
   public void registerCacheUsageListener(CacheUsageListener cacheUsageListener)
       throws IllegalStateException {
-    self().registerCacheUsageListener(cacheUsageListener);
+    self.registerCacheUsageListener(cacheUsageListener);
   }
 
-  @Override
   public void removeCacheUsageListener(CacheUsageListener cacheUsageListener)
       throws IllegalStateException {
-    self().removeCacheUsageListener(cacheUsageListener);
+    self.removeCacheUsageListener(cacheUsageListener);
   }
 
-  @Override
   public void setSampledStatisticsEnabled(boolean enableStatistics) {
-    self().setSampledStatisticsEnabled(enableStatistics);
+    self.setSampledStatisticsEnabled(enableStatistics);
   }
 
-  @Override
   public void setStatisticsEnabled(boolean enableStatistics) {
-    self().setStatisticsEnabled(enableStatistics);
-  }
-
-  @Override
-  public void putWithWriter(Element element) throws IllegalArgumentException, IllegalStateException, CacheException {
-    self().putWithWriter(element);
-  }
-
-  @Override
-  public Element putIfAbsent(Element element) throws NullPointerException {
-    return self().putIfAbsent(element);
-  }
-
-  @Override
-  public boolean removeElement(Element element) throws NullPointerException {
-    return self().removeElement(element);
-  }
-
-  @Override
-  public boolean replace(Element element, Element element1) throws NullPointerException, IllegalArgumentException {
-    return self().replace(element, element1);
-  }
-
-  @Override
-  public Element replace(Element element) throws NullPointerException {
-    return self().replace(element);
-  }
-
-  @Override
-  public boolean removeWithWriter(Object o) throws IllegalStateException, CacheException {
-    return self().removeWithWriter(o);
-  }
-
-  @Override
-  public long calculateOffHeapSize() throws IllegalStateException, CacheException {
-    return self().calculateOffHeapSize();
-  }
-
-  @Override
-  public long getOffHeapStoreSize() throws IllegalStateException {
-    return self().getOffHeapStoreSize();
-  }
-
-  @Override
-  public void registerCacheWriter(CacheWriter cacheWriter) {
-    self().registerCacheWriter(cacheWriter);
-  }
-
-  @Override
-  public void unregisterCacheWriter() {
-    self().unregisterCacheWriter();
-  }
-
-  @Override
-  public CacheWriter getRegisteredCacheWriter() {
-    return self().getRegisteredCacheWriter();
-  }
-
-  @Override
-  public void disableDynamicFeatures() {
-    self().disableDynamicFeatures();
-  }
-
-  @Override
-  public CacheWriterManager getWriterManager() {
-    return self().getWriterManager();
-  }
-
-  @Override
-  public boolean isClusterCoherent() {
-    return self().isClusterCoherent();
-  }
-
-  @Override
-  public boolean isNodeCoherent() {
-    return self().isNodeCoherent();
-  }
-
-  @Override
-  public void setNodeCoherent(boolean b) throws UnsupportedOperationException {
-    self().setNodeCoherent(b);
-  }
-
-  @Override
-  public void waitUntilClusterCoherent() throws UnsupportedOperationException {
-    self().waitUntilClusterCoherent();
-  }
-
-  @Override
-  public void setTransactionManagerLookup(TransactionManagerLookup transactionManagerLookup) {
-    self().setTransactionManagerLookup(transactionManagerLookup);
-  }
-
-  @Override
-  public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
-    self().addPropertyChangeListener(propertyChangeListener);
-  }
-
-  @Override
-  public void removePropertyChangeListener(PropertyChangeListener propertyChangeListener) {
-    self().removePropertyChangeListener(propertyChangeListener);
+    self.setStatisticsEnabled(enableStatistics);
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index 3d543b0..b9045bc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -1600,7 +1600,8 @@
 
     final List<String> idList = c.getFooterLines(CHANGE_ID);
     if (idList.isEmpty()) {
-      if (project.isRequireChangeID()) {
+      if (project.isRequireChangeID() && (cmd.getRefName().startsWith(NEW_CHANGE)
+  || NEW_PATCHSET.matcher(cmd.getRefName()).matches())) {
         reject(cmd, "missing Change-Id in commit message");
         return false;
       }
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg b/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
index 7cd3885..a0e3554 100644
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
+++ b/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
@@ -23,14 +23,14 @@
 # Check for, and add if missing, a unique Change-Id
 #
 add_ChangeId() {
-	clean_message=$(sed -e '
+	clean_message=`sed -e '
 		/^diff --git a\/.*/{
 			s///
 			q
 		}
 		/^Signed-off-by:/d
 		/^#/d
-	' "$MSG" | git stripspace)
+	' "$MSG" | git stripspace`
 	if test -z "$clean_message"
 	then
 		return
@@ -41,7 +41,7 @@
 		return
 	fi
 
-	id=$(_gen_ChangeId)
+	id=`_gen_ChangeId`
 	perl -e '
 		$MSG = shift;
 		$id = shift;
@@ -84,13 +84,13 @@
 	' "$MSG" "$id" "$CHANGE_ID_AFTER"
 }
 _gen_ChangeIdInput() {
-	echo "tree $(git write-tree)"
-	if parent=$(git rev-parse HEAD^0 2>/dev/null)
+	echo "tree `git write-tree`"
+	if parent=`git rev-parse HEAD^0 2>/dev/null`
 	then
 		echo "parent $parent"
 	fi
-	echo "author $(git var GIT_AUTHOR_IDENT)"
-	echo "committer $(git var GIT_COMMITTER_IDENT)"
+	echo "author `git var GIT_AUTHOR_IDENT`"
+	echo "committer `git var GIT_COMMITTER_IDENT`"
 	echo
 	printf '%s' "$clean_message"
 }
diff --git a/pom.xml b/pom.xml
index 9c75fc4..a2e00e5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,7 +53,7 @@
     <gwtVersion>2.1.1</gwtVersion>
     <slf4jVersion>1.6.1</slf4jVersion>
     <guiceVersion>2.0</guiceVersion>
-    <jettyVersion>7.4.0.v20110414</jettyVersion>
+    <jettyVersion>7.2.1.v20101111</jettyVersion>
 
     <gwt.compileReport>false</gwt.compileReport>
 
@@ -496,7 +496,7 @@
       <dependency>
         <groupId>net.sf.ehcache</groupId>
         <artifactId>ehcache-core</artifactId>
-        <version>2.3.0</version>
+        <version>1.7.2</version>
       </dependency>
 
       <dependency>