Merge branch 'master' of https://code.google.com/p/plexi.ad
diff --git a/src/com/google/enterprise/adaptor/ad/AdAdaptor.java b/src/com/google/enterprise/adaptor/ad/AdAdaptor.java
index 2db0331..3590e91 100644
--- a/src/com/google/enterprise/adaptor/ad/AdAdaptor.java
+++ b/src/com/google/enterprise/adaptor/ad/AdAdaptor.java
@@ -525,6 +525,7 @@
     private void resolvePrimaryGroups(Set<AdEntity> entities) {
       int nadds = 0;
       int missingGroups = 0;
+      Set<AdEntity> additionalGroupsToPush = new HashSet<AdEntity>();
       for (AdEntity e : entities) {
         if (e.isGroup()) {
           continue;
@@ -543,8 +544,17 @@
         }
         members.get(primaryGroup).add(user.getDn());
         wellKnownMembership.get(everyone).add(user.getDn());
+        // add the primary and "everyone" groups to the list of modified entries
+        // this is a no-op for a full crawl, but is needed for incremental crawl
+        // (and this routine does not know which type of crawl is being run).
+        additionalGroupsToPush.add(primaryGroup);
+        // "everyone" group added below, at most once
         nadds++;
       }
+      if (!additionalGroupsToPush.isEmpty()) {
+        entities.addAll(additionalGroupsToPush);
+        entities.add(everyone);
+      }
       log.log(Level.FINE, "# primary groups: {0}", members.keySet().size());
       if (missingGroups > 0) {
         log.log(Level.FINE, "# missing primary groups: {0}", missingGroups);
diff --git a/test/com/google/enterprise/adaptor/ad/AdAdaptorTest.java b/test/com/google/enterprise/adaptor/ad/AdAdaptorTest.java
index dabe94b..a00b22b 100644
--- a/test/com/google/enterprise/adaptor/ad/AdAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/ad/AdAdaptorTest.java
@@ -268,6 +268,7 @@
                .addSearchResult(filter, "sAMAccountName", searchDn, "sam");
 
     AdEntity userGroup = new AdEntity("S-1-5-32-users", "users");
+    AdEntity everyone = new AdEntity("S-1-1-0", "CN=everyone");
     AdServer adServer = new AdServer("localhost", ldapContext);
     adServer.initialize();
 
@@ -289,13 +290,12 @@
 
     final AdAdaptor.GroupCatalog golden = new AdAdaptor.GroupCatalog(
       defaultLocalizedStringMap(), "example.com", /*feedBuiltinGroups=*/ true,
-      /*entities*/ Sets.newHashSet(goldenEntity),
+      /*entities*/ Sets.newHashSet(goldenEntity, userGroup, everyone),
       /*members*/ goldenMembers,
       /*bySid*/ goldenSid,
       /*byDn*/ goldenDn,
       /*domain*/ goldenDomain);
     golden.wellKnownMembership.get(golden.everyone).add(goldenEntity.getDn());
-
     assertTrue(golden.equals(groupCatalog));
 
     // make sure readEverythingFrom call is idempotent