Use default value for remote.NAME.fetch

Mimic the behaviour of replicaton plugin which uses `refs/*:refs/*` as
default value for `remote.NAME.fetch`.

Change-Id: Iec2b0402103f1dee861626eacb79838f0cdb07a7
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java
index 67ac6f1..26a754a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java
@@ -19,14 +19,17 @@
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.config.GerritIsReplica;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.replication.ConfigParser;
 import com.googlesource.gerrit.plugins.replication.RemoteConfiguration;
+import com.googlesource.gerrit.plugins.replication.ReplicationConfig;
 import java.net.URISyntaxException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.transport.RefSpec;
 import org.eclipse.jgit.transport.RemoteConfig;
 import org.eclipse.jgit.transport.URIish;
 
@@ -35,10 +38,13 @@
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private boolean isReplica;
+  private Provider<ReplicationConfig> replicationConfigProvider;
 
   @Inject
-  SourceConfigParser(@GerritIsReplica Boolean isReplica) {
+  SourceConfigParser(
+      @GerritIsReplica Boolean isReplica, Provider<ReplicationConfig> replicationConfigProvider) {
     this.isReplica = isReplica;
+    this.replicationConfigProvider = replicationConfigProvider;
   }
 
   /* (non-Javadoc)
@@ -86,13 +92,14 @@
     for (String name : names) {
       try {
         final RemoteConfig remoteConfig = new RemoteConfig(cfg, name);
-        if (!isReplica || !remoteConfig.getFetchRefSpecs().isEmpty()) {
-          result.add(remoteConfig);
-        } else {
-          logger.atFine().log(
-              "Skip loading of remote [remote \"%s\"], since it has no 'fetch' configuration",
-              name);
+        if (remoteConfig.getFetchRefSpecs().isEmpty()) {
+          remoteConfig.setFetchRefSpecs(
+              List.of(
+                  new RefSpec()
+                      .setSourceDestination("refs/*", "refs/*")
+                      .setForceUpdate(replicationConfigProvider.get().isDefaultForceUpdate())));
         }
+        result.add(remoteConfig);
       } catch (URISyntaxException e) {
         throw new ConfigInvalidException(
             String.format("remote %s has invalid URL in %s", name, cfg));
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index a934dfb..ed0c5e7 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -127,6 +127,10 @@
 	the replication plugin. When the reload takes place, pending replication
 	events based on old settings are discarded. By default, false.
 
+gerrit.defaultForceUpdate
+:	If true, the default fetch refspec will be set to use forced update to
+	the local repository when no refspec is given.  By default, false.
+
 replication.lockErrorMaxRetries
 :	Number of times to retry a replication operation if a lock
 	error is detected.
@@ -443,6 +447,9 @@
 >  **NOT having** a `fetch` configuration for a remote, will also enable
 >  the standard _push_ replication for that remote.
 
+  Default: refs/*:refs/*, with the force fetch set to
+    `gerrit.defaultForceUpdate`
+
 [2]: #example_file
 
 remote.NAME.timeout