** Description changed:

- [ Impact ]
- 
  In Ubuntu devel (stonking), rust-coreutils provides tr. When parsing SET2 in 
tr, repeat constructs of the form [c*] where c is a hyphen '-' (for example 
'[-*]') fail with:
-   tr: range-endpoints of '[-*' are in reverse collating sequence order
+   tr: range-endpoints of '[-*' are in reverse collating sequence order
  
  GNU tr accepts this syntax. This incompatibility causes basez to fail to 
build from source (FTBFS) during ./configure, where line 27 runs:
-   PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s '[:blank:]' 
'[-*]'`
+   PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s '[:blank:]' 
'[-*]'`
  
  Because tr aborts, PKGNAME is empty and the build stops with:
-   Makefile:35: *** PKGNAME is missing. Stop.
+   Makefile:35: *** PKGNAME is missing. Stop.
  
- [ Fix ]
+ Root Cause:
+ In src/uu/tr/src/operation.rs (Sequence::parse_set), the parser alternatives 
used alt((Self::parse_char_range, Self::parse_char_star, ...)). Because 
parse_char_range ran before bracketed constructs, it matched '[' as start char, 
'-' as range delimiter, and '*' as end char. Since '[' (ASCII 91) is greater 
than '*' (ASCII 42), parse_char_range failed with BadSequence::BackwardsRange 
and stopped alt from trying parse_char_star.
  
- In src/uu/tr/src/operation.rs (Sequence::parse_set), the parser
- alternatives used alt((Self::parse_char_range, Self::parse_char_star,
- ...)). Because parse_char_range ran before bracketed constructs, it
- matched '[' as start char, '-' as range delimiter, and '*' as end char.
- Since '[' (ASCII 91) is greater than '*' (ASCII 42), parse_char_range
- failed with BadSequence::BackwardsRange and stopped alt from trying
- parse_char_star.
+ Fix:
+ Moving parse_char_range after the bracketed constructs (parse_char_star, 
parse_char_repeat, parse_class, parse_char_equal) fixes the issue. Bracketed 
constructs are now recognized before character ranges. Regression test 
test_repeat_hyphen added to tests/by-util/test_tr.rs.
  
- Moving parse_char_range after the bracketed constructs (parse_char_star,
- parse_char_repeat, parse_class, parse_char_equal) fixes the issue.
- Bracketed constructs are now recognized before character ranges.
- Regression test test_repeat_hyphen added to tests/by-util/test_tr.rs.
- 
- [ Test Plan ]
- 
- 1. Run repeat construct with hyphen:
-    echo "Base Z" | /usr/bin/tr -s '[:blank:]' '[-*]'
-    Expected stdout: "Base-Z"
-    Expected exit code: 0
- 
- 2. Run repeat construct with count:
-    echo "Base Z" | /usr/bin/tr -s '[:blank:]' '[-*5]'
-    Expected stdout: "Base-Z"
-    Expected exit code: 0
- 
- 3. Verify standard character ranges still work:
-    echo "abc" | /usr/bin/tr 'a-c' 'x-z'
-    Expected stdout: "xyz"
-    Expected exit code: 0
- 
- 4. Verify full tr integration test suite:
-    cargo test --package coreutils --test tests test_tr::
-    Expected result: 174 passed, 0 failed.
- 
- [ Where problems could occur ]
- 
- The change adjusts the priority of parser alternatives in
- Sequence::parse_set. Bracketed constructs ([c*], [c*n], [:class:],
- [=c=]) require bracket delimiters and are more specific than unbracketed
- ranges. If a malformed bracketed expression is parsed, it now reports a
- syntax error rather than falling back to character range parsing.
- Standard character ranges (such as a-z) are unaffected.
- 
- [ Other Info ]
- 
+ Upstream & Development Status:
  - Upstream Pull Request: https://github.com/uutils/coreutils/pull/15031 
(Merged)
- - Target series: Ubuntu devel (stonking, 26.10).
- - Target package version: rust-coreutils 0.12.0-1ubuntu3.
- - Test suite: full test_tr test suite passes (174 passed, 0 failed, 0 
regressions).
+ - Target: Ubuntu 26.10 (stonking development series)
+ - Proposed Package: rust-coreutils 0.12.0-1ubuntu3
+ - Verification: Full test_tr test suite passes (174 passed, 0 failed, 0 
regressions).
  
  --- [ Original Report ]
- 
- uutils tr rejects a "[c*]" repeat construct in SET2 when the repeated
- character is '-'. GNU tr accepts it. This makes basez fail to build from
- source in stonking.
+ uutils tr rejects a "[c*]" repeat construct in SET2 when the repeated 
character is '-'. GNU tr accepts it. This makes basez fail to build from source 
in stonking.
  
  == Reproducer ==
  
-   echo "Base Z" | tr -s '[:blank:]' '[-*]'
+ echo "Base Z" | tr -s '[:blank:]' '[-*]'
  
  GNU coreutils: prints "Base-Z"
  rust-coreutils 0.12.0-1ubuntu1 (from the build log below):
-   tr: range-endpoints of '[-*' are in reverse collating sequence order
+ tr: range-endpoints of '[-*' are in reverse collating sequence order
  
  In POSIX/GNU tr, "[c*]" in SET2 means "repeat c until SET2 is as long as
  SET1", so '[-*]' means "replace with '-'". uutils seems to parse "[-*"
  as a range from '[' to '*' before it recognises the repeat construct.
  uutils handles "[c*]" with ordinary characters, so the problem seems
  specific to '-' (and possibly other characters that are special in range
  syntax).
  
  Note: the uutils output above comes from the build log; this was not re-
  run directly against a uutils binary.
  
  == Impact ==
  
  basez 1.6.2-3build1 fails to build on all architectures in stonking (and 
failed in resolute):
  https://launchpad.net/ubuntu/+source/basez/1.6.2-3build1/+build/32793382
  
  Its configure script (line 27) does:
  
-   PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s
- '[:blank:]' '[-*]'`
+ PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s '[:blank:]'
+ '[-*]'`
  
  With uutils tr, PKGNAME ends up empty and the build stops:
  
-   tr: range-endpoints of '[-*' are in reverse collating sequence order
-   ...
-   Makefile:35: *** PKGNAME is missing.  Stop.
+ tr: range-endpoints of '[-*' are in reverse collating sequence order
+ ...
+ Makefile:35: *** PKGNAME is missing.  Stop.
  
  The build environment has coreutils-from-uutils 2ubuntu1 and rust-
  coreutils 0.12.0-1ubuntu1. Debian (GNU coreutils) is not affected.
  
  Other packages that use '[-*]' (or similar repeats of a range-special
  character) in tr calls are likely affected too.
  
  == Workaround ==
  
  In basez, replacing '[-*]' with '-' gives the same result with both
  implementations. The tr incompatibility should still be fixed in uutils;
  I did not find an existing upstream issue for it.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2169227

Title:
  tr: '[-*]' repeat construct in SET2 rejected as reversed range (breaks
  basez FTBFS)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/basez/+bug/2169227/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to