chiark / gitweb /
SyncLog: new facility, will help us find messages
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Apr 2021 15:42:22 +0000 (16:42 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Apr 2021 16:31:19 +0000 (17:31 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
apitest/apitest.rs
apitest/at-otter.rs
daemon/cmdlistener.rs
src/commands.rs
src/updates.rs
wdriver/wdriver.rs

index 31f1db18025743b4464c2f35a8a76dcbe3204f3f..442d1156cd81c7c13b339467fb287938e4ac0920 100644 (file)
@@ -813,7 +813,7 @@ impl MgmtChannel {
   fn game_synch(&mut self, game: InstanceName) -> Generation {
     let cmd = MgmtCommand::AlterGame {
       how: MgmtGameUpdateMode::Online,
-      insns: vec![ MgmtGameInstruction::Synch ],
+      insns: vec![ MgmtGameInstruction::SynchLog ],
       game
     };
     let gen = if_chain!{
index 85483db40225405671dd59bf3e4bdab33b846029..b677c3e5fece6a056bfd2bc857b64db94b58b981 100644 (file)
@@ -608,6 +608,21 @@ impl Ctx {
       alice.api_piece(GH::Raw, &mut a_p, alice_move_to)?;
       bob.synchx(Some(&mut b_pieces), None, |_sess, gen, k, v| {
         dbg!(gen, k, v);
+
+        if_chain! {
+          if k == "Log";
+          if let Some(html) = (|| Some({
+            v
+              .as_object()?
+              .get("logent")?
+              .as_object()?
+              .get("html")?
+              .as_str()?
+          }))();
+          if html.starts_with(SYNCH_LOGENTRY_PREFIX.as_html_str());
+          then { return; }
+        }
+
         panic!("bob saw something when alice moved displaced occulted");
       })?;
 
index b5d3142ba09cbf876735184ddb52c71a7e052745..1b91fa2509c9e3cbde0d1a993d334a25f7c1925e 100644 (file)
@@ -453,6 +453,14 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
       no_updates(ig, mgr)
     }
 
+    MGI::SynchLog => {
+      let superuser = cs.superuser.ok_or(ME::SuperuserAuthorisationRequired)?;
+      let ig = ig.by_mut(superuser.into());
+      let (gen, mgr) = some_synch_core(ig)?;
+      let log = LogEntry { html: synch_logentry(gen) };
+      (U{ pcs: vec![], log: vec![log], raw: None }, mgr, None, ig)
+    },
+
     MGI::PieceIdLookupFwd { player, piece } => {
       pieceid_lookup(
         cs, ig, player,
index 36acc155cb2652b94b4c8f7b9a79170aea48e168..455b1be47e0499876f94d2fc8bc3d456641de637 100644 (file)
@@ -82,7 +82,7 @@ pub enum MgmtGameInstruction {
   SetTableColour(ColourSpec),
 
   /// For testing, mostly.
-  Synch,
+  Synch, SynchLog,
   /// For testing only
   PieceIdLookupFwd { piece: PieceId, player: PlayerId, },
   /// For testing only
index 3b42fc90cbd9496c2e7937109b780b0a1dab7663..76a2950a4e2dac8ae4ab03d74a6a1858a271e313 100644 (file)
@@ -1011,3 +1011,9 @@ fn serialize_logentry<S:Serializer>(&(tz,logent): &TransmitUpdateLogEntry,
   let f: FormattedLogEntry = (tz, logent).into();
   f.serialize(s)
 }
+
+pub const SYNCH_LOGENTRY_PREFIX: HtmlLit = Html::lit("### SynchLog ");
+
+pub fn synch_logentry(gen: Generation) -> Html {
+  hformat!("{} gen={} ###", SYNCH_LOGENTRY_PREFIX, gen.0)
+}
index 1533823ed8cacced738230dd5c4a1066c02506e9..b008eb82f216a9ef22a1b9aad89a4b3c73213809 100644 (file)
@@ -604,7 +604,7 @@ impl<'g> WindowGuard<'g> {
   }
 
   #[throws(AE)]
-  fn synch_raw(&mut self) {
+  fn synch_raw(&mut self) -> String {
     let gen = self.su.mgmt_conn().game_synch(self.w.instance.clone())?;
     (|| {
       loop {
@@ -630,6 +630,7 @@ impl<'g> WindowGuard<'g> {
       Ok::<(),AE>(())
     })()
       .context("await gen update via async js script")?;
+    synch_logentry(gen).into_html_string()
   }
 
   #[throws(AE)]