The unified diff between revisions [c0152bc5..] and [b08b1694..] is displayed below. It can also be downloaded as a raw diff.

#
#
# patch "cmd_netsync.cc"
#  from [424c270866fc33f5067b2399f5f77920b9bce99c]
#    to [37e31660e83fcd5cd6cff8fd3b5b8b2f019181da]
#
============================================================
--- cmd_netsync.cc	424c270866fc33f5067b2399f5f77920b9bce99c
+++ cmd_netsync.cc	37e31660e83fcd5cd6cff8fd3b5b8b2f019181da
@@ -237,6 +237,42 @@ CMD(push, "push", "", CMD_REF(network),
                        client_voice, source_role, info);
 }

+CMD_AUTOMATE(push, N_("[ADDRESS[:PORTNUMBER] [PATTERN ...]]"),
+             N_("Pushes branches to a netsync server"),
+             "",
+             options::opts::set_default | options::opts::exclude |
+             options::opts::key_to_push | options::opts::do_not_enforce_ssh_agent)
+{
+  database db(app);
+  key_store keys(app);
+  project_t project(db);
+
+  if (!app.opts.do_not_enforce_ssh_agent)
+  {
+    // enforce that any command which needs to encrypt a private key later on
+    // uses the ssh_agent to do the task, because we cannot handle password
+    // prompts over stdio. basically this is the same as giving --ssh-sign=only
+    // as option to stdio, but it is more explicit. however, this also leaves
+    // the opportunity of giving a possible passphrase via the get_passphrase
+    // lua hook, because the ssh agent is _always_ used, but its a reasonable
+    // trade-off
+    keys.enforce_ssh_agent();
+  }
+
+  netsync_connection_info info;
+  extract_client_connection_info(app.opts, app.lua, db, keys, args, info);
+
+  if (app.opts.signing_key() != "" && !app.opts.do_not_enforce_ssh_agent)
+    {
+      N(keys.agent_knows_key(app.opts.signing_key),
+        F("key '%s' is unknown to the running ssh-agent instance")
+            % app.opts.signing_key);
+    }
+
+  run_netsync_protocol(app.opts, app.lua, project, keys,
+                       client_voice, source_role, info);
+}
+
 CMD(pull, "pull", "", CMD_REF(network),
     N_("[ADDRESS[:PORTNUMBER] [PATTERN ...]]"),
     N_("Pulls branches from a netsync server"),
@@ -263,8 +299,7 @@ CMD_AUTOMATE(pull, N_("[ADDRESS[:PORTNUM
              N_("Pulls branches from a netsync server"),
              "",
              options::opts::set_default | options::opts::exclude |
-             options::opts::do_not_enforce_ssh_agent
-)
+             options::opts::do_not_enforce_ssh_agent)
 {
   database db(app);
   key_store keys(app);
@@ -310,7 +345,7 @@ CMD(sync, "sync", "", CMD_REF(network),
     N_("This synchronizes branches that match the pattern given in PATTERN "
        "with the netsync server at the address ADDRESS."),
     options::opts::set_default | options::opts::exclude |
-    options::opts::key_to_push)
+    options::opts::key_to_push | options::opts::do_not_enforce_ssh_agent)
 {
   database db(app);
   key_store keys(app);
@@ -330,6 +365,42 @@ CMD(sync, "sync", "", CMD_REF(network),
                        client_voice, source_and_sink_role, info);
 }

+CMD_AUTOMATE(sync, N_("[ADDRESS[:PORTNUMBER] [PATTERN ...]]"),
+             N_("Synchronizes branches with a netsync server"),
+             "",
+             options::opts::set_default | options::opts::exclude |
+             options::opts::key_to_push)
+{
+  database db(app);
+  key_store keys(app);
+  project_t project(db);
+
+  if (!app.opts.do_not_enforce_ssh_agent)
+    {
+      // enforce that any command which needs to encrypt a private key later on
+      // uses the ssh_agent to do the task, because we cannot handle password
+      // prompts over stdio. basically this is the same as giving --ssh-sign=only
+      // as option to stdio, but it is more explicit. however, this also leaves
+      // the opportunity of giving a possible passphrase via the get_passphrase
+      // lua hook, because the ssh agent is _always_ used, but its a reasonable
+      // trade-off
+      keys.enforce_ssh_agent();
+    }
+
+  netsync_connection_info info;
+  extract_client_connection_info(app.opts, app.lua, db, keys, args, info);
+
+  if (app.opts.signing_key() != "" && !app.opts.do_not_enforce_ssh_agent)
+    {
+      N(keys.agent_knows_key(app.opts.signing_key),
+        F("key '%s' is unknown to the running ssh-agent instance")
+            % app.opts.signing_key);
+    }
+
+  run_netsync_protocol(app.opts, app.lua, project, keys,
+                       client_voice, source_and_sink_role, info);
+}
+
 class dir_cleanup_helper
 {
 public: