Merge "In ProjectAccessScreen add link to history of project.config in gitweb"
diff --git a/Documentation/cmd-query.txt b/Documentation/cmd-query.txt
index b20ac92..bc3950b 100644
--- a/Documentation/cmd-query.txt
+++ b/Documentation/cmd-query.txt
@@ -12,6 +12,7 @@
   [--format {TEXT | JSON}]
   [--current-patch-set]
   [--patch-sets | --all-approvals]
+  [--files]
   [--comments]
   [--]
   <query>
@@ -59,6 +60,10 @@
 	the --current-patch-set flag then the current patch set
 	information will be output twice, once in each field.
 
+--files::
+	Support for listing files with patch sets and their
+	attributes (ADDED, MODIFIED, DELETED, RENAMED, COPIED).
+
 --comments::
 	Include comments for all changes. If combined with the
 	--patch-sets flag then all in-line comments are included for
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
index b439e6c..bfdc69f 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
@@ -277,7 +277,6 @@
 
   private static String legacyChange(final String token) {
     final String s = skip(token);
-    final String q = "patchset=";
     final String t[] = s.split(",", 2);
     if (t.length > 1 && matchPrefix("patchset=", t[1])) {
       return PageLinks.toChange(PatchSet.Id.parse(t[0] + "," + skip(t[1])));
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
index 76495e7..7585f8a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
@@ -16,7 +16,6 @@
 
 import com.google.gerrit.client.Dispatcher;
 import com.google.gerrit.client.Gerrit;
-import com.google.gerrit.client.rpc.GerritCallback;
 import com.google.gerrit.client.ui.Hyperlink;
 import com.google.gerrit.client.ui.NavigationTable;
 import com.google.gerrit.common.data.GroupDetail;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java
index d27d684..d9203f5 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java
@@ -195,7 +195,7 @@
     String path = authConfig.getCookiePath();
     if (path == null || path.isEmpty()) {
       path = request.getContextPath();
-      if (path.isEmpty()) {
+      if (path == null || path.isEmpty()) {
         path = "/";
       }
     }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java
index 11c94a7..e170f54 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java
@@ -19,7 +19,6 @@
 
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.AuthConfig;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gwtjsonrpc.server.XsrfException;
 import com.google.inject.Inject;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java
index 4ae5c30..4a3e113 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java
@@ -99,7 +99,6 @@
       // If we don't yet have a token for this session, establish one.
       //
       final int nonceLen = 20;
-      final ByteArrayOutputStream buf;
       final byte[] rnd = new byte[nonceLen];
       prng.nextBytes(rnd);
       xsrfToken = CookieBase64.encode(rnd);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java
index f69a0d6..ec5ec1c 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java
@@ -33,7 +33,6 @@
 import com.google.gerrit.reviewdb.ContactInformation;
 import com.google.gerrit.reviewdb.ContributorAgreement;
 import com.google.gerrit.reviewdb.ReviewDb;
-import com.google.gerrit.reviewdb.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountByEmailCache;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
index 5d86954..310b401 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
@@ -82,6 +82,7 @@
    * @param sv unique key.
    * @return the value; null if not stored.
    */
+  @SuppressWarnings("unchecked")
   public <T> T get(StoredValue<T> sv) {
     return (T) storedValues.get(sv);
   }
@@ -93,6 +94,7 @@
    * @param sv unique key.
    * @param obj the value to store under {@code sv}.
    */
+  @SuppressWarnings("unchecked")
   public <T> void set(StoredValue<T> sv, T obj) {
     storedValues.put((StoredValue<Object>) sv, obj);
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
index 89f5ab2..93665f4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
@@ -403,11 +403,11 @@
     hooks.doChangeRestoreHook(updatedChange, user.getAccount(), message);
   }
 
-  private static void updatedChange(final ReviewDb db, final IdentifiedUser user,
-      final Change change, final ChangeMessage cmsg,
-      ReplyToChangeSender.Factory senderFactory, final String err)
-      throws NoSuchChangeException, InvalidChangeOperationException,
-      EmailException, OrmException {
+  private static <T extends ReplyToChangeSender> void updatedChange(
+      final ReviewDb db, final IdentifiedUser user, final Change change,
+      final ChangeMessage cmsg, ReplyToChangeSender.Factory<T> senderFactory,
+      final String err) throws NoSuchChangeException,
+      InvalidChangeOperationException, EmailException, OrmException {
     if (change == null) {
       throw new InvalidChangeOperationException(err);
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
index 6b60ee1..5810533 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
@@ -26,6 +26,9 @@
 import com.google.gerrit.reviewdb.TrackingId;
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListEntry;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -43,14 +46,17 @@
   private final AccountCache accountCache;
   private final Provider<String> urlProvider;
   private final ApprovalTypes approvalTypes;
+  private final PatchListCache patchListCache;
 
   @Inject
   EventFactory(AccountCache accountCache,
       @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      ApprovalTypes approvalTypes) {
+      ApprovalTypes approvalTypes,
+      PatchListCache patchListCache) {
     this.accountCache = accountCache;
     this.urlProvider = urlProvider;
     this.approvalTypes = approvalTypes;
+    this.patchListCache = patchListCache;
   }
 
   /**
@@ -114,11 +120,18 @@
   }
 
   public void addPatchSets(ChangeAttribute a, Collection<PatchSet> ps) {
-    addPatchSets(a, ps, null);
+    addPatchSets(a, ps, null, false, null);
   }
 
   public void addPatchSets(ChangeAttribute ca, Collection<PatchSet> ps,
       Map<PatchSet.Id,Collection<PatchSetApproval>> approvals) {
+    addPatchSets(ca, ps, approvals, false, null);
+  }
+
+  public void addPatchSets(ChangeAttribute ca, Collection<PatchSet> ps,
+      Map<PatchSet.Id,Collection<PatchSetApproval>> approvals,
+      boolean includeFiles, Change change) {
+
     if (!ps.isEmpty()) {
       ca.patchSets = new ArrayList<PatchSetAttribute>(ps.size());
       for (PatchSet p : ps) {
@@ -127,6 +140,9 @@
           addApprovals(psa, p.getId(), approvals);
         }
         ca.patchSets.add(psa);
+        if (includeFiles && change != null) {
+          addPatchSetFileNames(psa, change, p);
+        }
       }
     }
   }
@@ -145,6 +161,21 @@
     }
   }
 
+  public void addPatchSetFileNames(PatchSetAttribute patchSetAttribute,
+      Change change, PatchSet patchSet) {
+    PatchList patchList = patchListCache.get(change, patchSet);
+    for (PatchListEntry patch : patchList.getPatches()) {
+      if (patchSetAttribute.files == null) {
+        patchSetAttribute.files = new ArrayList<PatchAttribute>();
+      }
+
+      PatchAttribute p = new PatchAttribute();
+      p.file = patch.getNewName();
+      p.type = patch.getChangeType();
+      patchSetAttribute.files.add(p);
+    }
+  }
+
   public void addComments(ChangeAttribute ca,
       Collection<ChangeMessage> messages) {
     if (!messages.isEmpty()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchAttribute.java
new file mode 100644
index 0000000..2b08fa7
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchAttribute.java
@@ -0,0 +1,22 @@
+// Copyright (C) 2011 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.events;
+
+import com.google.gerrit.reviewdb.Patch.ChangeType;
+
+public class PatchAttribute {
+    public String file;
+    public ChangeType type;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetAttribute.java
index ee29314..dca4438 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetAttribute.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetAttribute.java
@@ -25,4 +25,5 @@
 
     public List<ApprovalAttribute> approvals;
     public List<PatchSetCommentAttribute> comments;
+    public List<PatchAttribute> files;
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
index 6d44511..c7e2055 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
@@ -36,7 +36,6 @@
 import com.googlecode.prolog_cafe.lang.Prolog;
 import com.googlecode.prolog_cafe.lang.PrologException;
 import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
 import com.googlecode.prolog_cafe.lang.Term;
 import com.googlecode.prolog_cafe.lang.VariableTerm;
 
@@ -46,7 +45,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
@@ -315,7 +313,9 @@
                 filterRule,
                 resultsTerm,
                 new VariableTerm());
-            results.addAll(((ListTerm) template[2]).toJava());
+            @SuppressWarnings("unchecked")
+            final List<? extends Term> termList = ((ListTerm) template[2]).toJava();
+            results.addAll(termList);
           } catch (PrologException err) {
             return logRuleError("Exception calling " + filterRule + " on change "
                 + change.getId() + " of " + parentState.getProject().getName(), err);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
index ee42833..5a3f0bd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
@@ -19,7 +19,6 @@
 import com.google.gerrit.common.data.Capable;
 import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
 import com.google.gerrit.reviewdb.AbstractAgreement;
 import com.google.gerrit.reviewdb.AccountAgreement;
 import com.google.gerrit.reviewdb.AccountGroup;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
index 2abec9a..2143b81 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
@@ -73,6 +73,7 @@
   private boolean includeCurrentPatchSet;
   private boolean includeApprovals;
   private boolean includeComments;
+  private boolean includeFiles;
 
   private OutputStream outputStream = DisabledOutputStream.INSTANCE;
   private PrintWriter out;
@@ -106,6 +107,10 @@
     includeComments = on;
   }
 
+  public void setIncludeFiles(boolean on) {
+    includeFiles = on;
+  }
+
   public void setOutput(OutputStream out, OutputFormat fmt) {
     this.outputStream = out;
     this.outputFormat = fmt;
@@ -173,8 +178,14 @@
           eventFactory.addTrackingIds(c, d.trackingIds(db));
 
           if (includePatchSets) {
-            eventFactory.addPatchSets(c, d.patches(db),
-              includeApprovals ? d.approvalsMap(db) : null);
+            if (includeFiles) {
+              eventFactory.addPatchSets(c, d.patches(db),
+                includeApprovals ? d.approvalsMap(db) : null,
+                includeFiles, d.change(db));
+            } else {
+              eventFactory.addPatchSets(c, d.patches(db),
+                  includeApprovals ? d.approvalsMap(db) : null);
+            }
           }
 
           if (includeCurrentPatchSet) {
@@ -183,6 +194,11 @@
               c.currentPatchSet = eventFactory.asPatchSetAttribute(current);
               eventFactory.addApprovals(c.currentPatchSet, //
                   d.approvalsFor(db, current.getId()));
+
+              if (includeFiles) {
+                eventFactory.addPatchSetFileNames(c.currentPatchSet,
+                    d.change(db), d.currentPatchSet(db));
+              }
             }
           }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java
index 152f25a..89ee5cf 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java
@@ -30,7 +30,6 @@
 import com.google.gerrit.common.data.GroupReference;
 import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
 import com.google.gerrit.reviewdb.AccountGroup;
 import com.google.gerrit.reviewdb.ApprovalCategory;
 import com.google.gerrit.reviewdb.Project;
diff --git a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java b/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
index 94d5b07..27bc286 100644
--- a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
+++ b/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
@@ -15,13 +15,7 @@
 package gerrit;
 
 import com.google.gerrit.reviewdb.Account;
-import com.google.gerrit.reviewdb.PatchSet;
-import com.google.gerrit.reviewdb.PatchSetInfo;
 import com.google.gerrit.reviewdb.UserIdentity;
-import com.google.gerrit.rules.PrologEnvironment;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
 
 import com.googlecode.prolog_cafe.lang.IntegerTerm;
 import com.googlecode.prolog_cafe.lang.Operation;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java b/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
index 4a9c71b..77bd81e 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
@@ -15,7 +15,6 @@
 package gerrit;
 
 import com.google.gerrit.reviewdb.Patch;
-import com.google.gerrit.reviewdb.PatchSetInfo;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.patch.PatchList;
 import com.google.gerrit.server.patch.PatchListEntry;
@@ -80,7 +79,6 @@
     engine.areg3 = arg3;
     engine.areg4 = arg4;
 
-    PatchSetInfo psInfo = StoredValues.PATCH_SET_INFO.get(engine);
     PatchList pl = StoredValues.PATCH_LIST.get(engine);
     Iterator<PatchListEntry> iter = pl.getPatches().iterator();
 
@@ -99,6 +97,7 @@
       Term a5 = engine.areg5;
 
       Pattern regex = (Pattern)((JavaObjectTerm)a1).object();
+      @SuppressWarnings("unchecked")
       Iterator<PatchListEntry> iter =
         (Iterator<PatchListEntry>)((JavaObjectTerm)a5).object();
       while (iter.hasNext()) {
@@ -148,6 +147,7 @@
     public Operation exec(Prolog engine) {
       Term a5 = engine.areg5;
 
+      @SuppressWarnings("unchecked")
       Iterator<PatchListEntry> iter =
         (Iterator<PatchListEntry>)((JavaObjectTerm)a5).object();
       if (!iter.hasNext()) {
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java b/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
index f9e3036..f0accf0 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
@@ -14,8 +14,6 @@
 
 package gerrit;
 
-import com.google.gerrit.reviewdb.PatchSetInfo;
-import com.google.gerrit.rules.PrologEnvironment;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.patch.PatchList;
 import com.google.gerrit.server.patch.PatchListEntry;
@@ -28,7 +26,6 @@
 import com.googlecode.prolog_cafe.lang.Predicate;
 import com.googlecode.prolog_cafe.lang.Prolog;
 import com.googlecode.prolog_cafe.lang.PrologException;
-import com.googlecode.prolog_cafe.lang.SystemException;
 import com.googlecode.prolog_cafe.lang.Term;
 
 import org.eclipse.jgit.diff.Edit;
@@ -75,8 +72,6 @@
     Pattern fileRegex = getRegexParameter(a1);
     Pattern editRegex = getRegexParameter(a2);
 
-    PrologEnvironment env = (PrologEnvironment) engine.control;
-    PatchSetInfo psInfo = StoredValues.PATCH_SET_INFO.get(engine);
     PatchList pl = StoredValues.PATCH_LIST.get(engine);
     Repository repo = StoredValues.REPOSITORY.get(engine);
 
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java
index b6f5d26..ff8d6bd 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java
@@ -56,6 +56,11 @@
     processor.setIncludeComments(on);
   }
 
+  @Option(name = "--files", usage = "Include file list on patch sets")
+  void setFiles(boolean on) {
+    processor.setIncludeFiles(on);
+  }
+
   @Argument(index = 0, required = true, multiValued = true, metaVar = "QUERY", usage = "Query to execute")
   private List<String> query;