hglib/commands/
update.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this file,
3// You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use crate::client::{Client, HglibError, Runner};
6use crate::{runcommand, MkArg};
7
8pub struct Arg<'a> {
9    pub rev: &'a str,
10    pub clean: bool,
11    pub check: bool,
12    pub date: &'a str,
13}
14
15impl<'a> Default for Arg<'a> {
16    fn default() -> Self {
17        Self {
18            rev: "",
19            clean: false,
20            check: false,
21            date: "",
22        }
23    }
24}
25
26impl<'a> Arg<'a> {
27    fn run(&self, client: &mut Client) -> Result<(Vec<u8>, i32), HglibError> {
28        runcommand!(
29            client,
30            "update",
31            &[""],
32            "-r",
33            self.rev,
34            "-C",
35            self.clean,
36            "-c",
37            self.check,
38            "-d",
39            self.date
40        )
41    }
42}
43
44#[derive(Debug, PartialEq)]
45pub struct Update {
46    pub updated: u32,
47    pub merged: u32,
48    pub removed: u32,
49    pub unresolved: u32,
50}
51
52impl Client {
53    pub fn update(&mut self, x: Arg) -> Result<Update, HglibError> {
54        let data = match x.run(self) {
55            Ok((data, _)) => data,
56            Err(err) => {
57                if err.code == 1 && err.out.is_some() {
58                    err.out.unwrap()
59                } else {
60                    return Err(err);
61                }
62            }
63        };
64
65        let iter = &mut data.iter();
66        let n = iter.find(|x| b'0' <= **x && **x <= b'9').unwrap();
67        let n = u32::from(n - b'0');
68
69        let updated = iter
70            .take_while(|x| **x != b' ')
71            .fold(n, |r, x| r * 10 + u32::from(*x - b'0'));
72        iter.find(|x| **x == b',').unwrap();
73        iter.next();
74
75        let merged = iter
76            .take_while(|x| **x != b' ')
77            .fold(0, |r, x| r * 10 + u32::from(*x - b'0'));
78        iter.find(|x| **x == b',').unwrap();
79        iter.next();
80
81        let removed = iter
82            .take_while(|x| **x != b' ')
83            .fold(0, |r, x| r * 10 + u32::from(*x - b'0'));
84        iter.find(|x| **x == b',').unwrap();
85        iter.next();
86
87        let unresolved = iter
88            .take_while(|x| **x != b' ')
89            .fold(0, |r, x| r * 10 + u32::from(*x - b'0'));
90
91        Ok(Update {
92            updated,
93            merged,
94            removed,
95            unresolved,
96        })
97    }
98}