Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
ion
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Enzo Cioppettini
ion
Commits
35e1a537
Commit
35e1a537
authored
6 years ago
by
stratact
Committed by
Michael Aaron Murphy
6 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Fix for
#768
(#769)
* Fix
#768
* Add integration test * Add unit test
parent
d168fce2
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
examples/braces.ion
+2
-1
2 additions, 1 deletion
examples/braces.ion
examples/braces.out
+1
-0
1 addition, 0 deletions
examples/braces.out
src/lib/parser/shell_expand/mod.rs
+28
-4
28 additions, 4 deletions
src/lib/parser/shell_expand/mod.rs
with
31 additions
and
5 deletions
examples/braces.ion
+
2
−
1
View file @
35e1a537
...
@@ -3,6 +3,7 @@ echo 1{A{1,2},B{1,2}}
...
@@ -3,6 +3,7 @@ echo 1{A{1,2},B{1,2}}
# permutating braces
# permutating braces
echo {0,1}abc{2,3,4}def{5,6,7}{g,h,i}
echo {0,1}abc{2,3,4}def{5,6,7}{g,h,i}
echo It{{em,alic}iz,erat}e{d,}
# inclusive ranges
# inclusive ranges
echo {-1...1}
echo {-1...1}
...
@@ -34,4 +35,4 @@ echo {a..2..f}
...
@@ -34,4 +35,4 @@ echo {a..2..f}
echo {A..2..F}
echo {A..2..F}
echo {0..-2..-5}
echo {0..-2..-5}
echo {e..-2..a}
echo {e..-2..a}
echo {E..-2..A}
echo {E..-2..A}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
examples/braces.out
+
1
−
0
View file @
35e1a537
1A1 1A2 1B1 1B2
1A1 1A2 1B1 1B2
0abc2def5g 0abc2def5h 0abc2def5i 0abc2def6g 0abc2def6h 0abc2def6i 0abc2def7g 0abc2def7h 0abc2def7i 0abc3def5g 0abc3def5h 0abc3def5i 0abc3def6g 0abc3def6h 0abc3def6i 0abc3def7g 0abc3def7h 0abc3def7i 0abc4def5g 0abc4def5h 0abc4def5i 0abc4def6g 0abc4def6h 0abc4def6i 0abc4def7g 0abc4def7h 0abc4def7i 1abc2def5g 1abc2def5h 1abc2def5i 1abc2def6g 1abc2def6h 1abc2def6i 1abc2def7g 1abc2def7h 1abc2def7i 1abc3def5g 1abc3def5h 1abc3def5i 1abc3def6g 1abc3def6h 1abc3def6i 1abc3def7g 1abc3def7h 1abc3def7i 1abc4def5g 1abc4def5h 1abc4def5i 1abc4def6g 1abc4def6h 1abc4def6i 1abc4def7g 1abc4def7h 1abc4def7i
0abc2def5g 0abc2def5h 0abc2def5i 0abc2def6g 0abc2def6h 0abc2def6i 0abc2def7g 0abc2def7h 0abc2def7i 0abc3def5g 0abc3def5h 0abc3def5i 0abc3def6g 0abc3def6h 0abc3def6i 0abc3def7g 0abc3def7h 0abc3def7i 0abc4def5g 0abc4def5h 0abc4def5i 0abc4def6g 0abc4def6h 0abc4def6i 0abc4def7g 0abc4def7h 0abc4def7i 1abc2def5g 1abc2def5h 1abc2def5i 1abc2def6g 1abc2def6h 1abc2def6i 1abc2def7g 1abc2def7h 1abc2def7i 1abc3def5g 1abc3def5h 1abc3def5i 1abc3def6g 1abc3def6h 1abc3def6i 1abc3def7g 1abc3def7h 1abc3def7i 1abc4def5g 1abc4def5h 1abc4def5i 1abc4def6g 1abc4def6h 1abc4def6i 1abc4def7g 1abc4def7h 1abc4def7i
Itemized Itemize Italicized Italicize Iterated Iterate
-1 0 1
-1 0 1
2 1 0
2 1 0
a b c
a b c
...
...
This diff is collapsed.
Click to expand it.
src/lib/parser/shell_expand/mod.rs
+
28
−
4
View file @
35e1a537
...
@@ -198,12 +198,22 @@ pub(crate) fn expand_string<E: Expander>(
...
@@ -198,12 +198,22 @@ pub(crate) fn expand_string<E: Expander>(
)
->
Array
{
)
->
Array
{
let
mut
token_buffer
=
Vec
::
new
();
let
mut
token_buffer
=
Vec
::
new
();
let
mut
contains_brace
=
false
;
let
mut
contains_brace
=
false
;
let
mut
word_iterator
=
WordIterator
::
new
(
original
,
expand_func
);
for
word
in
WordIterator
::
new
(
original
,
expand_func
)
{
loop
{
if
let
WordToken
::
Brace
(
_
)
=
word
{
match
word_iterator
.next
()
{
contains_brace
=
true
;
Some
(
word
)
=>
{
if
let
WordToken
::
Brace
(
_
)
=
word
{
contains_brace
=
true
;
}
token_buffer
.push
(
word
);
}
None
if
original
.is_empty
()
=>
{
token_buffer
.push
(
WordToken
::
Normal
(
""
,
true
,
false
));
break
;
}
None
=>
break
,
}
}
token_buffer
.push
(
word
);
}
}
expand_tokens
(
&
token_buffer
,
expand_func
,
reverse_quoting
,
contains_brace
)
expand_tokens
(
&
token_buffer
,
expand_func
,
reverse_quoting
,
contains_brace
)
...
@@ -689,6 +699,20 @@ mod test {
...
@@ -689,6 +699,20 @@ mod test {
);
);
}
}
#[test]
fn
expand_braces_v2
()
{
let
line
=
"It{{em,alic}iz,erat}e{d,}"
;
let
expected
=
"Itemized Itemize Italicized Italicize Iterated Iterate"
;
let
expanded
=
expand_string
(
line
,
&
VariableExpander
,
false
);
assert_eq!
(
expected
.split_whitespace
()
.map
(|
x
|
x
.to_owned
())
.collect
::
<
Array
>
(),
expanded
);
}
#[test]
#[test]
fn
expand_variables_with_colons
()
{
fn
expand_variables_with_colons
()
{
let
expanded
=
expand_string
(
"$FOO:$BAR"
,
&
VariableExpander
,
false
);
let
expanded
=
expand_string
(
"$FOO:$BAR"
,
&
VariableExpander
,
false
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment