diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index aab1b18..38f7228 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -14,7 +14,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: Required tools + run: cargo install cargo-deny && rustup component add clippy + - name: Clippy + run: cargo clippy --all-targets --all-features -- -D warnings - name: Build run: cargo build --verbose + - name: License check + run: cargo deny -L debug --all-features --locked check - name: Run tests run: cargo test --verbose \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 74b2bc6..8891f3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [0.3.1] - 2024-05-12 +Contains minor fixes to the command line tool. + +## Fixed + +- Sorting now consider messages' id. [#42](https://github.com/mrtryhard/qt-ts-tools/issues/42) + ## [0.3.0] - 2024-04-22 [Third milestone](https://github.com/mrtryhard/qt-ts-tools/milestone/3). This introduces the `merge` command and improved documentation. diff --git a/deny.toml b/deny.toml index f82bd1e..ae2892a 100644 --- a/deny.toml +++ b/deny.toml @@ -1,16 +1,7 @@ -# This template contains all of the possible sections and their default values - -# Note that all fields that take a lint level have these possible values: -# * deny - An error will be produced and the check will fail -# * warn - A warning will be produced, but the check will not fail -# * allow - No warning or error will be produced, though in some cases a note -# will be - -# The values provided in this template are the default values that will be used -# when any section or field is not specified in your own configuration - -# Root options +# https://embarkstudios.github.io/cargo-deny/checks/ +# Graph options +[graph] # If 1 or more target triples (and optionally, target_features) are specified, # only the specified targets will be checked when running `cargo deny check`. # This means, if a particular package is only ever used as a target specific @@ -19,15 +10,8 @@ # this list would mean the nix crate, as well as any of its exclusive # dependencies not shared by any other crates, would be ignored, as the target # list here is effectively saying which targets you are building for. -targets = [ - # The triple can be any string, but only the target triples built in to - # rustc (as of 1.40) can be checked against actual config expressions - #{ triple = "x86_64-unknown-linux-musl" }, - # You can also specify which target_features you promise are enabled for a - # particular target. target_features are currently not validated against - # the actual valid features supported by the target architecture. - #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, -] +targets = [] + # When creating the dependency graph used as the source of truth when checks are # executed, this field can be used to prune crates from the graph, removing them # from the view of cargo-deny. This is an extremely heavy hammer, as if a crate @@ -46,6 +30,8 @@ no-default-features = false # If set, these feature will be enabled when collecting metadata. If `--features` # is specified on the cmd line they will take precedence over this option. #features = [] + +[output] # When outputting inclusion graphs in diagnostics that include features, this # option can be used to specify the depth at which feature edges will be added. # This option is included since the graphs can be quite large and the addition @@ -57,32 +43,18 @@ feature-depth = 1 # More documentation for the advisories section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html [advisories] +version = 2 # The path where the advisory database is cloned/fetched into db-path = "~/.cargo/advisory-db" # The url(s) of the advisory databases to use db-urls = ["https://github.com/rustsec/advisory-db"] -# The lint level for security vulnerabilities -vulnerability = "deny" -# The lint level for unmaintained crates -unmaintained = "warn" # The lint level for crates that have been yanked from their source registry yanked = "warn" -# The lint level for crates with security notices. -notice = "warn" # A list of advisory IDs to ignore. Note that ignored advisories will still # output a note when they are encountered. ignore = [ #"RUSTSEC-0000-0000", ] -# Threshold for security vulnerabilities, any vulnerability with a CVSS score -# lower than the range specified will be ignored. Note that ignored advisories -# will still output a note when they are encountered. -# * None - CVSS Score 0.0 -# * Low - CVSS Score 0.1 - 3.9 -# * Medium - CVSS Score 4.0 - 6.9 -# * High - CVSS Score 7.0 - 8.9 -# * Critical - CVSS Score 9.0 - 10.0 -#severity-threshold = # If this is true, then cargo deny will use the git executable to fetch advisory database. # If this is false, then it uses a built-in git library. @@ -94,37 +66,12 @@ ignore = [ # More documentation for the licenses section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html [licenses] -# The lint level for crates which do not have a detectable license -unlicensed = "deny" +version = 2 # List of explicitly allowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. allow = [ "MIT", "Apache-2.0", ] -# List of explicitly disallowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -deny = [ - #"Nokia", -] -# Lint level for licenses considered copyleft -copyleft = "warn" -# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses -# * both - The license will be approved if it is both OSI-approved *AND* FSF -# * either - The license will be approved if it is either OSI-approved *OR* FSF -# * osi - The license will be approved if it is OSI approved -# * fsf - The license will be approved if it is FSF Free -# * osi-only - The license will be approved if it is OSI-approved *AND NOT* FSF -# * fsf-only - The license will be approved if it is FSF *AND NOT* OSI-approved -# * neither - This predicate is ignored and the default lint level is used -allow-osi-fsf-free = "neither" -# Lint level used when no other predicates are matched -# 1. License isn't in the allow or deny lists -# 2. License isn't copyleft -# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" -default = "deny" # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the # canonical license text of a valid SPDX license file. @@ -142,26 +89,6 @@ exceptions = [ ], name = "unicode-ident", version = "*" }, ] -# Some crates don't have (easily) machine readable licensing information, -# adding a clarification entry for it allows you to manually specify the -# licensing information -#[[licenses.clarify]] -# The name of the crate the clarification applies to -#name = "ring" -# The optional version constraint for the crate -#version = "*" -# The SPDX expression for the license requirements of the crate -#expression = "MIT AND ISC AND OpenSSL" -# One or more files in the crate's source used as the "source of truth" for -# the license expression. If the contents match, the clarification will be used -# when running the license check, otherwise the clarification will be ignored -# and the crate will be checked normally, which may produce warnings or errors -# depending on the rest of your configuration -#license-files = [ - # Each entry is a crate relative path, and the (opaque) hash of its contents - #{ path = "LICENSE-APACHE", hash = 0xbd0eed23 } -#] - [licenses.private] # If true, ignores workspace crates that aren't published, or are only # published to private registries. @@ -202,50 +129,16 @@ allow = [ #{ name = "ansi_term", version = "=0.11.0" }, ] # List of crates to deny -deny = [ - # Each entry the name of a crate and a version range. If version is - # not specified, all versions will be matched. - #{ name = "ansi_term", version = "=0.11.0" }, - # - # Wrapper crates can optionally be specified to allow the crate when it - # is a direct dependency of the otherwise banned crate - #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, -] - -# List of features to allow/deny -# Each entry the name of a crate and a version range. If version is -# not specified, all versions will be matched. -#[[bans.features]] -#name = "reqwest" -# Features to not allow -#deny = ["json"] -# Features to allow -#allow = [ -# "rustls", -# "__rustls", -# "__tls", -# "hyper-rustls", -# "rustls", -# "rustls-pemfile", -# "rustls-tls-webpki-roots", -# "tokio-rustls", -# "webpki-roots", -#] -# If true, the allowed features must exactly match the enabled feature set. If -# this is set there is no point setting `deny` -#exact = true +deny = [] # Certain crates/versions that will be skipped when doing duplicate detection. -skip = [ - #{ name = "ansi_term", version = "=0.11.0" }, -] +skip = [] + # Similarly to `skip` allows you to skip certain crates during duplicate # detection. Unlike skip, it also includes the entire tree of transitive # dependencies starting at the specified crate, up to a certain depth, which is # by default infinite. -skip-tree = [ - #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, -] +skip-tree = [] # This section is considered when running `cargo deny check sources`. # More documentation about the 'sources' section can be found here: @@ -262,11 +155,3 @@ unknown-git = "warn" allow-registry = ["https://github.com/rust-lang/crates.io-index"] # List of URLs for allowed Git repositories allow-git = [] - -[sources.allow-org] -# 1 or more github.com organizations to allow git sources for -github = [] -# 1 or more gitlab.com organizations to allow git sources for -gitlab = [] -# 1 or more bitbucket.org organizations to allow git sources for -bitbucket = [] diff --git a/src/ts.rs b/src/ts.rs index c76801e..d9e1586 100644 --- a/src/ts.rs +++ b/src/ts.rs @@ -31,25 +31,25 @@ pub enum YesNo { #[serde(rename = "TS")] pub struct TSNode { #[serde(rename = "@version", skip_serializing_if = "Option::is_none")] - version: Option, + pub version: Option, #[serde(rename = "@sourcelanguage", skip_serializing_if = "Option::is_none")] - source_language: Option, + pub source_language: Option, #[serde(rename = "@language", skip_serializing_if = "Option::is_none")] - language: Option, + pub language: Option, #[serde(rename = "context", skip_serializing_if = "Vec::is_empty", default)] pub contexts: Vec, #[serde(rename = "message", skip_serializing_if = "Vec::is_empty", default)] pub messages: Vec, #[serde(skip_serializing_if = "Option::is_none")] - dependencies: Option, + pub dependencies: Option, #[serde(skip_serializing_if = "Option::is_none")] - comment: Option, + pub comment: Option, #[serde(skip_serializing_if = "Option::is_none")] - oldcomment: Option, + pub oldcomment: Option, #[serde(skip_serializing_if = "Option::is_none")] - extracomment: Option, + pub extracomment: Option, #[serde(skip_serializing_if = "Option::is_none")] - translatorcomment: Option, + pub translatorcomment: Option, /* Following section corresponds to `extra-something` in Qt's XSD. From documentation: > extra elements may appear in TS and message elements. Each element may appear @@ -94,12 +94,12 @@ pub struct ContextNode { #[derive(Debug, Deserialize, Serialize, PartialEq)] pub struct DependenciesNode { #[serde(rename = "dependency")] - dependencies: Vec, + pub dependencies: Vec, } #[derive(Debug, Deserialize, Serialize, PartialEq)] pub struct Dependency { - catalog: String, + pub catalog: String, } #[derive(Debug, Eq, Clone, Deserialize, Serialize, PartialEq)] @@ -122,16 +122,16 @@ pub struct MessageNode { pub oldcomment: Option, /// The real comment (added by developer/designer) #[serde(skip_serializing_if = "Option::is_none")] - extracomment: Option, + pub extracomment: Option, /// Comment added by translator #[serde(skip_serializing_if = "Option::is_none")] - translatorcomment: Option, + pub translatorcomment: Option, #[serde(rename = "@numerus", skip_serializing_if = "Option::is_none")] - numerus: Option, + pub numerus: Option, #[serde(skip_serializing_if = "Option::is_none")] pub id: Option, #[serde(skip_serializing_if = "Option::is_none")] - userdata: Option, + pub userdata: Option, /* Following section corresponds to `extra-something` in Qt's XSD. From documentation: > extra elements may appear in TS and message elements. Each element may appear @@ -167,15 +167,15 @@ pub struct TranslationNode { // Did not find a way to make it an enum // Therefore: either you have a `translation_simple` or a `numerus_forms`, but not both. #[serde(rename = "$text", skip_serializing_if = "Option::is_none")] - translation_simple: Option, + pub translation_simple: Option, #[serde(rename = "numerusform", skip_serializing_if = "Vec::is_empty", default)] - numerus_forms: Vec, + pub numerus_forms: Vec, #[serde(rename = "@type", skip_serializing_if = "Option::is_none")] pub translation_type: Option, #[serde(skip_serializing_if = "Option::is_none")] - variants: Option, + pub variants: Option, #[serde(skip_serializing_if = "Option::is_none")] - userdata: Option, // deprecated + pub userdata: Option, // deprecated } #[derive(Debug, Eq, Clone, Deserialize, Serialize, PartialEq)] @@ -189,13 +189,19 @@ pub struct LocationNode { #[derive(Debug, Eq, Clone, Deserialize, Serialize, PartialEq)] pub struct NumerusFormNode { #[serde(default, rename = "$value", skip_serializing_if = "String::is_empty")] - text: String, + pub text: String, #[serde(rename = "@variants", skip_serializing_if = "Option::is_none")] - variants: Option, + pub variants: Option, } impl PartialOrd for MessageNode { fn partial_cmp(&self, other: &Self) -> Option { + let id_cmp = other.id.cmp(&self.id); + + if id_cmp != Ordering::Equal { + return Some(id_cmp); + } + let min_self = self .locations .iter() diff --git a/test_data/example_merge_result.xml b/test_data/example_merge_result.xml index 43679db..d02e0d8 100644 --- a/test_data/example_merge_result.xml +++ b/test_data/example_merge_result.xml @@ -3,13 +3,6 @@ kernel/in_merge - - Only In Left Message - - Only in Left translation - - Left message - Now Right Source Source string Left should be in oldsource @@ -18,6 +11,13 @@ idBasedLeft + + Only In Left Message + + Only in Left translation + + Left message + Newsletter