forks/sorcery

git clone https://git.gae.moe/forks/sorcery

Charlotte Somreplace refresh endpoint with local control socketf9138f5

darwin-flake
2.2 KiB63 linesraw
1//! Client for sorceryd's control socket (see `daemon/control.rs` there).
2
3use std::io::{BufRead, BufReader, Write};
4use std::os::unix::net::UnixStream;
5use std::path::Path;
6
7use anyhow::{Context, Result, bail};
8
9/// Ask sorceryd to rebuild the site for the repository at `repo` now.
10pub fn send(socket: &Path, repo: &Path) -> Result<()> {
11    let mut stream = UnixStream::connect(socket)
12        .with_context(|| format!("connecting to sorcery control socket {}", socket.display()))?;
13    writeln!(stream, "{}", repo.display())?;
14    let mut reply = String::new();
15    BufReader::new(stream).read_line(&mut reply)?;
16    if reply.split_whitespace().next() != Some("ok") {
17        bail!("sorcery replied {:?}", reply.trim_end());
18    }
19    Ok(())
20}
21
22#[cfg(test)]
23mod tests {
24    use std::os::unix::net::UnixListener;
25    use std::thread;
26
27    use super::*;
28
29    fn serve_once(socket: &Path, reply: &'static str) -> thread::JoinHandle<String> {
30        let listener = UnixListener::bind(socket).unwrap();
31        thread::spawn(move || {
32            let (mut connection, _) = listener.accept().unwrap();
33            let mut request = String::new();
34            BufReader::new(connection.try_clone().unwrap())
35                .read_line(&mut request)
36                .unwrap();
37            connection.write_all(reply.as_bytes()).unwrap();
38            request
39        })
40    }
41
42    #[test]
43    fn sends_repository_path_and_interprets_reply() {
44        let temp = tempfile::tempdir().unwrap();
45        let repo = Path::new("/home/git/public/alice/a repo");
46
47        let server = serve_once(
48            &temp.path().join("ok"),
49            "ok https://git.example/alice/a%20repo\n",
50        );
51        send(&temp.path().join("ok"), repo).unwrap();
52        assert_eq!(server.join().unwrap(), "/home/git/public/alice/a repo\n");
53
54        let server = serve_once(&temp.path().join("bare"), "ok\n");
55        send(&temp.path().join("bare"), repo).unwrap();
56        server.join().unwrap();
57
58        let server = serve_once(&temp.path().join("error"), "error nope\n");
59        let error = send(&temp.path().join("error"), repo).unwrap_err();
60        server.join().unwrap();
61        assert!(error.to_string().contains("nope"));
62    }
63}