From 8d0c69a27dc84cc4fafe5f840e26e3bb8f257500 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Fri, 29 Apr 2022 09:51:18 +1000 Subject: [PATCH 1/5] Use term fmt instead of lint We only run the formatter (`cargo fmt`) not the linter (`cargo clippy`). Use the appropriate term in the test script and the CI configuration. --- .github/workflows/rust.yml | 6 +++--- contrib/test.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index da85fb91c..5fdca7e18 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -3,8 +3,8 @@ on: [push, pull_request] name: Continuous integration jobs: - lint_fuzz_stable: - name: Lint + Fuzz + fmt_fuzz_stable: + name: Fmt + Fuzz runs-on: ubuntu-latest strategy: matrix: @@ -24,7 +24,7 @@ jobs: - name: Running fuzzer env: DO_FUZZ: true - DO_LINT: true + DO_FMT: true run: ./contrib/test.sh Nightly: diff --git a/contrib/test.sh b/contrib/test.sh index f9fa0b47c..021027cce 100755 --- a/contrib/test.sh +++ b/contrib/test.sh @@ -8,8 +8,8 @@ then alias cargo="cargo +$TOOLCHAIN" fi -# Lint if told to -if [ "$DO_LINT" = true ] +# Format if told to +if [ "$DO_FMT" = true ] then ( rustup component add rustfmt From f7f6f3bde6a7a9cdedb7bc16ef0d510e3d8af54f Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Thu, 28 Apr 2022 11:28:31 +1000 Subject: [PATCH 2/5] Run cargo fmt with nightly toolchain Running `rustfmt` with the nightly toolchain allows us to use unstable options. Users can still run it with the stable toolchain locally and ignore the warnings. --- .github/workflows/rust.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 5fdca7e18..efca76af8 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -3,8 +3,8 @@ on: [push, pull_request] name: Continuous integration jobs: - fmt_fuzz_stable: - name: Fmt + Fuzz + Fuzz: + name: Fuzz runs-on: ubuntu-latest strategy: matrix: @@ -24,11 +24,10 @@ jobs: - name: Running fuzzer env: DO_FUZZ: true - DO_FMT: true run: ./contrib/test.sh Nightly: - name: Bench + Docs + name: Bench + Docs + Fmt runs-on: ubuntu-latest steps: - name: Checkout Crate @@ -47,6 +46,10 @@ jobs: env: DO_DOCS: true run: ./contrib/test.sh + - name: Running formatter + env: + DO_FMT: true + run: ./contrib/test.sh UnitTests: name: Tests From ccdef6facdf13adbb611b5ccda1d5bed6ebc2f92 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Thu, 28 Apr 2022 11:07:16 +1000 Subject: [PATCH 3/5] Add rustfmt configuration file Generate and add a default configuration file for `rustfmt` using rustfmt --print-config default rustfmt.toml This produces a config file that causes `rustfmt` to make no changes, as expected, when we run cargo +nightly fmt Please note, the config file includes unstable options which throw warnings if used without the nightly toolchain. --- rustfmt.toml | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 rustfmt.toml diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 000000000..12e59d643 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,77 @@ +max_width = 100 +hard_tabs = false +tab_spaces = 4 +newline_style = "Auto" +indent_style = "Block" +use_small_heuristics = "Default" +fn_call_width = 60 +attr_fn_like_width = 70 +struct_lit_width = 18 +struct_variant_width = 35 +array_width = 60 +chain_width = 60 +single_line_if_else_max_width = 50 +wrap_comments = false +format_code_in_doc_comments = false +comment_width = 80 +normalize_comments = false +normalize_doc_attributes = false +license_template_path = "" +format_strings = false +format_macro_matchers = false +format_macro_bodies = true +hex_literal_case = "Preserve" +empty_item_single_line = true +struct_lit_single_line = true +fn_single_line = false +where_single_line = false +imports_indent = "Block" +imports_layout = "Mixed" +imports_granularity = "Preserve" +group_imports = "Preserve" +reorder_imports = true +reorder_modules = true +reorder_impl_items = false +type_punctuation_density = "Wide" +space_before_colon = false +space_after_colon = true +spaces_around_ranges = false +binop_separator = "Front" +remove_nested_parens = true +combine_control_expr = true +overflow_delimited_expr = false +struct_field_align_threshold = 0 +enum_discrim_align_threshold = 0 +match_arm_blocks = true +match_arm_leading_pipes = "Never" +force_multiline_blocks = false +fn_args_layout = "Tall" +brace_style = "SameLineWhere" +control_brace_style = "AlwaysSameLine" +trailing_semicolon = true +trailing_comma = "Vertical" +match_block_trailing_comma = false +blank_lines_upper_bound = 1 +blank_lines_lower_bound = 0 +edition = "2015" +version = "One" +inline_attribute_width = 0 +format_generated_files = true +merge_derives = true +use_try_shorthand = false +use_field_init_shorthand = false +force_explicit_abi = true +condense_wildcard_suffixes = false +color = "Auto" +required_version = "1.4.38" +unstable_features = false +disable_all_formatting = false +skip_children = false +hide_parse_errors = false +error_on_line_overflow = false +error_on_unformatted = false +report_todo = "Never" +report_fixme = "Never" +ignore = [] +emit_mode = "Files" +make_backup = false From a89edba4e79061e5194b6ca80a3388d18496deee Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Tue, 10 May 2022 14:25:28 +1000 Subject: [PATCH 4/5] Configure group_imports Configure `group_imports = "StdExternalCrate"`. The benefit of this option is that it increases uniformity in the code base over the default "Preserve", while saving devs needing to think about where they place their import statements (for those that do not use tooling to add them). --- examples/htlc.rs | 3 ++- examples/parse.rs | 3 ++- examples/sign_multisig.rs | 5 +++-- examples/verify_tx.rs | 3 ++- rustfmt.toml | 2 +- src/descriptor/bare.rs | 9 ++++----- src/descriptor/checksum.rs | 3 ++- src/descriptor/key.rs | 4 ++-- src/descriptor/mod.rs | 21 +++++++++++---------- src/descriptor/pretaproot.rs | 3 +-- src/descriptor/segwitv0.rs | 9 ++++----- src/descriptor/sh.rs | 9 ++++----- src/descriptor/sortedmulti.rs | 3 ++- src/descriptor/tr.rs | 29 +++++++++++++++-------------- src/expression.rs | 1 - src/interpreter/error.rs | 3 ++- src/interpreter/inner.rs | 9 +++++---- src/interpreter/mod.rs | 19 ++++++++++--------- src/lib.rs | 3 +-- src/miniscript/analyzable.rs | 5 +++-- src/miniscript/astelem.rs | 1 - src/miniscript/context.rs | 9 ++++----- src/miniscript/decode.rs | 10 +++++----- src/miniscript/iter.rs | 10 ++++++---- src/miniscript/lex.rs | 4 ++-- src/miniscript/mod.rs | 26 +++++++++++++------------- src/miniscript/ms_tests.rs | 3 ++- src/miniscript/satisfy.rs | 4 ++-- src/miniscript/types/extra_props.rs | 8 ++++---- src/policy/compiler.rs | 14 ++++++++------ src/policy/concrete.rs | 5 +++-- src/policy/mod.rs | 13 +++++++------ src/policy/semantic.rs | 6 +++--- src/psbt/finalizer.rs | 22 +++++++++++----------- src/psbt/mod.rs | 9 +++++---- src/util.rs | 2 +- 36 files changed, 152 insertions(+), 140 deletions(-) diff --git a/examples/htlc.rs b/examples/htlc.rs index 2bcf86d7d..c669823aa 100644 --- a/examples/htlc.rs +++ b/examples/htlc.rs @@ -14,11 +14,12 @@ //! Example: Create an HTLC with miniscript using the policy compiler +use std::str::FromStr; + use bitcoin::Network; use miniscript::descriptor::Wsh; use miniscript::policy::{Concrete, Liftable}; use miniscript::DescriptorTrait; -use std::str::FromStr; fn main() { // HTLC policy with 10:1 odds for happy (co-operative) case compared to uncooperative case. diff --git a/examples/parse.rs b/examples/parse.rs index a0fa561f0..017d0c91c 100644 --- a/examples/parse.rs +++ b/examples/parse.rs @@ -14,9 +14,10 @@ //! Example: Parsing a descriptor from a string. -use miniscript::{descriptor::DescriptorType, Descriptor, DescriptorTrait}; use std::str::FromStr; +use miniscript::{descriptor::DescriptorType, Descriptor, DescriptorTrait}; + fn main() { let desc = miniscript::Descriptor::::from_str( "wsh(c:pk_k(020202020202020202020202020202020202020202020202020202020202020202))", diff --git a/examples/sign_multisig.rs b/examples/sign_multisig.rs index bbd5f4266..1ad82034e 100644 --- a/examples/sign_multisig.rs +++ b/examples/sign_multisig.rs @@ -14,11 +14,12 @@ //! Example: Signing a 2-of-3 multisignature. +use std::collections::HashMap; +use std::str::FromStr; + use bitcoin::blockdata::witness::Witness; use bitcoin::secp256k1; use miniscript::DescriptorTrait; -use std::collections::HashMap; -use std::str::FromStr; fn main() { let mut tx = spending_transaction(); diff --git a/examples/verify_tx.rs b/examples/verify_tx.rs index 123c82429..dd8cc75ff 100644 --- a/examples/verify_tx.rs +++ b/examples/verify_tx.rs @@ -14,11 +14,12 @@ //! Example: Verifying a signed transaction. +use std::str::FromStr; + use bitcoin::consensus::Decodable; use bitcoin::secp256k1::{self, Secp256k1}; use bitcoin::util::sighash; use miniscript::interpreter::KeySigPair; -use std::str::FromStr; fn main() { // diff --git a/rustfmt.toml b/rustfmt.toml index 12e59d643..f61bac29a 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -28,7 +28,7 @@ where_single_line = false imports_indent = "Block" imports_layout = "Mixed" imports_granularity = "Preserve" -group_imports = "Preserve" +group_imports = "StdExternalCrate" # Default "Preserve" reorder_imports = true reorder_modules = true reorder_impl_items = false diff --git a/src/descriptor/bare.rs b/src/descriptor/bare.rs index 97056603f..ed8407e7c 100644 --- a/src/descriptor/bare.rs +++ b/src/descriptor/bare.rs @@ -22,6 +22,10 @@ use std::{fmt, str::FromStr}; use bitcoin::{self, blockdata::script, Script}; +use super::{ + checksum::{desc_checksum, verify_checksum}, + DescriptorTrait, +}; use crate::expression::{self, FromTree}; use crate::miniscript::context::ScriptContext; use crate::policy::{semantic, Liftable}; @@ -31,11 +35,6 @@ use crate::{ TranslatePk, }; -use super::{ - checksum::{desc_checksum, verify_checksum}, - DescriptorTrait, -}; - /// Create a Bare Descriptor. That is descriptor that is /// not wrapped in sh or wsh. This covers the Pk descriptor #[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] diff --git a/src/descriptor/checksum.rs b/src/descriptor/checksum.rs index 2701fd4ab..31a9ad966 100644 --- a/src/descriptor/checksum.rs +++ b/src/descriptor/checksum.rs @@ -100,9 +100,10 @@ pub(super) fn verify_checksum(s: &str) -> Result<&str, Error> { } #[cfg(test)] mod test { - use super::*; use std::str; + use super::*; + macro_rules! check_expected { ($desc: expr, $checksum: expr) => { assert_eq!(desc_checksum($desc).unwrap(), $checksum); diff --git a/src/descriptor/key.rs b/src/descriptor/key.rs index b14bc489d..9621fe106 100644 --- a/src/descriptor/key.rs +++ b/src/descriptor/key.rs @@ -796,11 +796,11 @@ impl ToPublicKey for DerivedDescriptorKey { #[cfg(test)] mod test { - use super::{DescriptorKeyParseError, DescriptorPublicKey, DescriptorSecretKey}; + use std::str::FromStr; use bitcoin::secp256k1; - use std::str::FromStr; + use super::{DescriptorKeyParseError, DescriptorPublicKey, DescriptorSecretKey}; #[test] fn parse_descriptor_key_errors() { diff --git a/src/descriptor/mod.rs b/src/descriptor/mod.rs index c3ec6d658..65a42a3f0 100644 --- a/src/descriptor/mod.rs +++ b/src/descriptor/mod.rs @@ -857,13 +857,10 @@ serde_string_impl_pk!(Descriptor, "a script descriptor"); #[cfg(test)] mod tests { - use super::checksum::desc_checksum; - use super::tr::Tr; - use super::*; - use crate::descriptor::key::Wildcard; - use crate::descriptor::{DescriptorPublicKey, DescriptorSecretKey, DescriptorXKey, SinglePub}; - use crate::hex_script; - use crate::{Descriptor, DummyKey, Error, Miniscript, Satisfier, TranslatePk2}; + use std::cmp; + use std::collections::HashMap; + use std::str::FromStr; + use bitcoin::blockdata::opcodes::all::{OP_CLTV, OP_CSV}; use bitcoin::blockdata::script::Instruction; use bitcoin::blockdata::{opcodes, script}; @@ -871,12 +868,16 @@ mod tests { use bitcoin::hashes::{hash160, sha256}; use bitcoin::util::bip32; use bitcoin::{self, secp256k1, EcdsaSighashType, PublicKey}; - use std::cmp; - use std::collections::HashMap; - use std::str::FromStr; + use super::checksum::desc_checksum; + use super::tr::Tr; + use super::*; + use crate::descriptor::key::Wildcard; + use crate::descriptor::{DescriptorPublicKey, DescriptorSecretKey, DescriptorXKey, SinglePub}; + use crate::hex_script; #[cfg(feature = "compiler")] use crate::policy; + use crate::{Descriptor, DummyKey, Error, Miniscript, Satisfier, TranslatePk2}; type StdDescriptor = Descriptor; const TEST_PK: &'static str = diff --git a/src/descriptor/pretaproot.rs b/src/descriptor/pretaproot.rs index a55980a06..8330d2d85 100644 --- a/src/descriptor/pretaproot.rs +++ b/src/descriptor/pretaproot.rs @@ -241,13 +241,12 @@ serde_string_impl_pk!(PreTaprootDescriptor, "a pre-taproot script descriptor"); pub(crate) mod traits { use bitcoin::Script; + use super::PreTaprootDescriptor; use crate::{ descriptor::{Pkh, Sh, Wpkh, Wsh}, DescriptorTrait, MiniscriptKey, ToPublicKey, }; - use super::PreTaprootDescriptor; - /// A general trait for Pre taproot bitcoin descriptor. /// Similar to [`DescriptorTrait`], but `explicit_script` and `script_code` methods cannot fail pub trait PreTaprootDescriptorTrait: DescriptorTrait { diff --git a/src/descriptor/segwitv0.rs b/src/descriptor/segwitv0.rs index 21791d36f..c9b2ea5da 100644 --- a/src/descriptor/segwitv0.rs +++ b/src/descriptor/segwitv0.rs @@ -20,6 +20,10 @@ use std::{fmt, str::FromStr}; use bitcoin::{self, Script}; +use super::{ + checksum::{desc_checksum, verify_checksum}, + DescriptorTrait, SortedMultiVec, +}; use crate::expression::{self, FromTree}; use crate::miniscript::context::{ScriptContext, ScriptContextError}; use crate::policy::{semantic, Liftable}; @@ -28,11 +32,6 @@ use crate::{ Error, ForEach, ForEachKey, Miniscript, MiniscriptKey, Satisfier, Segwitv0, ToPublicKey, TranslatePk, }; - -use super::{ - checksum::{desc_checksum, verify_checksum}, - DescriptorTrait, SortedMultiVec, -}; /// A Segwitv0 wsh descriptor #[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] pub struct Wsh { diff --git a/src/descriptor/sh.rs b/src/descriptor/sh.rs index 90f54ca54..b433fd65d 100644 --- a/src/descriptor/sh.rs +++ b/src/descriptor/sh.rs @@ -22,6 +22,10 @@ use std::{fmt, str::FromStr}; use bitcoin::{self, blockdata::script, Script}; +use super::{ + checksum::{desc_checksum, verify_checksum}, + DescriptorTrait, SortedMultiVec, Wpkh, Wsh, +}; use crate::expression::{self, FromTree}; use crate::miniscript::context::ScriptContext; use crate::policy::{semantic, Liftable}; @@ -32,11 +36,6 @@ use crate::{ ToPublicKey, TranslatePk, }; -use super::{ - checksum::{desc_checksum, verify_checksum}, - DescriptorTrait, SortedMultiVec, Wpkh, Wsh, -}; - /// A Legacy p2sh Descriptor #[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] pub struct Sh { diff --git a/src/descriptor/sortedmulti.rs b/src/descriptor/sortedmulti.rs index 0a26b0258..2ab1a9b48 100644 --- a/src/descriptor/sortedmulti.rs +++ b/src/descriptor/sortedmulti.rs @@ -242,10 +242,11 @@ impl fmt::Display for SortedMultiVec