diff --git a/rust/hg-core/src/dirstate/dirstate_map.rs b/rust/hg-core/src/dirstate/dirstate_map.rs
--- a/rust/hg-core/src/dirstate/dirstate_map.rs
+++ b/rust/hg-core/src/dirstate/dirstate_map.rs
@@ -7,13 +7,13 @@
use crate::{
dirstate::{parsers::PARENT_SIZE, EntryState},
- pack_dirstate, parse_dirstate,
- utils::copy_into_array,
- CopyMap, DirsIterable, DirsMultiset, DirstateEntry, DirstateError,
- DirstateMapError, DirstateParents, DirstateParseError, StateMap,
+ pack_dirstate, parse_dirstate, CopyMap, DirsIterable, DirsMultiset,
+ DirstateEntry, DirstateError, DirstateMapError, DirstateParents,
+ DirstateParseError, StateMap,
};
use core::borrow::Borrow;
use std::collections::{HashMap, HashSet};
+use std::convert::TryInto;
use std::iter::FromIterator;
use std::ops::Deref;
use std::time::Duration;
@@ -260,10 +260,10 @@ impl DirstateMap {
let parents;
if file_contents.len() == PARENT_SIZE * 2 {
parents = DirstateParents {
- p1: copy_into_array(&file_contents[..PARENT_SIZE]),
- p2: copy_into_array(
- &file_contents[PARENT_SIZE..PARENT_SIZE * 2],
- ),
+ p1: file_contents[..PARENT_SIZE].try_into().unwrap(),
+ p2: file_contents[PARENT_SIZE..PARENT_SIZE * 2]
+ .try_into()
+ .unwrap(),
};
} else if file_contents.is_empty() {
parents = DirstateParents {
diff --git a/rust/hg-core/src/dirstate/parsers.rs b/rust/hg-core/src/dirstate/parsers.rs
--- a/rust/hg-core/src/dirstate/parsers.rs
+++ b/rust/hg-core/src/dirstate/parsers.rs
@@ -5,7 +5,6 @@
use crate::{
dirstate::{CopyMap, EntryState, StateMap},
- utils::copy_into_array,
DirstateEntry, DirstatePackError, DirstateParents, DirstateParseError,
};
use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
@@ -31,8 +30,8 @@ pub fn parse_dirstate(
let mut curr_pos = PARENT_SIZE * 2;
let parents = DirstateParents {
- p1: copy_into_array(&contents[..PARENT_SIZE]),
- p2: copy_into_array(&contents[PARENT_SIZE..curr_pos]),
+ p1: contents[..PARENT_SIZE].try_into().unwrap(),
+ p2: contents[PARENT_SIZE..curr_pos].try_into().unwrap(),
};
while curr_pos < contents.len() {
diff --git a/rust/hg-core/src/utils.rs b/rust/hg-core/src/utils.rs
--- a/rust/hg-core/src/utils.rs
+++ b/rust/hg-core/src/utils.rs
@@ -9,23 +9,6 @@
pub mod files;
-use std::convert::AsMut;
-
-/// Takes a slice and copies it into an array.
-///
-/// # Panics
-///
-/// Will panic if the slice and target array don't have the same length.
-pub fn copy_into_array(slice: &[T]) -> A
-where
- A: Sized + Default + AsMut<[T]>,
- T: Copy,
-{
- let mut a = Default::default();
- >::as_mut(&mut a).copy_from_slice(slice);
- a
-}
-
/// Replaces the `from` slice with the `to` slice inside the `buf` slice.
///
/// # Examples
diff --git a/rust/hg-cpython/src/dirstate/dirstate_map.rs b/rust/hg-cpython/src/dirstate/dirstate_map.rs
--- a/rust/hg-cpython/src/dirstate/dirstate_map.rs
+++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs
@@ -24,7 +24,7 @@ use crate::{
ref_sharing::PySharedState,
};
use hg::{
- utils::copy_into_array, DirsIterable, DirsMultiset, DirstateEntry,
+ DirsIterable, DirsMultiset, DirstateEntry,
DirstateMap as RustDirstateMap, DirstateParents, DirstateParseError,
EntryState,
};
@@ -239,8 +239,9 @@ py_class!(pub class DirstateMap |py| {
}
def setparents(&self, p1: PyObject, p2: PyObject) -> PyResult {
- let p1 = copy_into_array(p1.extract::(py)?.data(py));
- let p2 = copy_into_array(p2.extract::(py)?.data(py));
+ // TODO: don't panic; raise Python exception instead.
+ let p1 = p1.extract::(py)?.data(py).try_into().unwrap();
+ let p2 = p2.extract::(py)?.data(py).try_into().unwrap();
self.inner(py)
.borrow_mut()
@@ -274,8 +275,9 @@ py_class!(pub class DirstateMap |py| {
) -> PyResult {
let now = Duration::new(now.extract(py)?, 0);
let parents = DirstateParents {
- p1: copy_into_array(p1.extract::(py)?.data(py)),
- p2: copy_into_array(p2.extract::(py)?.data(py)),
+ // TODO: don't panic; raise Python exception instead.
+ p1: p1.extract::(py)?.data(py).try_into().unwrap(),
+ p2: p2.extract::(py)?.data(py).try_into().unwrap(),
};
match self.borrow_mut(py)?.pack(parents, now) {
diff --git a/rust/hg-cpython/src/parsers.rs b/rust/hg-cpython/src/parsers.rs
--- a/rust/hg-cpython/src/parsers.rs
+++ b/rust/hg-cpython/src/parsers.rs
@@ -15,10 +15,11 @@ use cpython::{
PythonObject, ToPyObject,
};
use hg::{
- pack_dirstate, parse_dirstate, utils::copy_into_array, DirstateEntry,
+ pack_dirstate, parse_dirstate, DirstateEntry,
DirstatePackError, DirstateParents, DirstateParseError, PARENT_SIZE,
};
use std::collections::HashMap;
+use std::convert::TryInto;
use libc::c_char;
@@ -120,8 +121,8 @@ fn pack_dirstate_wrapper(
&mut dirstate_map,
&copies?,
DirstateParents {
- p1: copy_into_array(&p1),
- p2: copy_into_array(&p2),
+ p1: p1.try_into().unwrap(),
+ p2: p2.try_into().unwrap(),
},
Duration::from_secs(now.as_object().extract::(py)?),
) {