From 9f78d965d6f442d293f2b28353a12caa10a5665d Mon Sep 17 00:00:00 2001 From: Shriram V Date: Thu, 12 Jan 2017 08:55:28 +0530 Subject: [PATCH 01/36] Added command line option to set tab_size, and help --- beautify_bash.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/beautify_bash.py b/beautify_bash.py index 091124f..cf16722 100644 --- a/beautify_bash.py +++ b/beautify_bash.py @@ -22,6 +22,7 @@ import re import sys +import getopt PVERSION = '1.0' @@ -156,15 +157,29 @@ def beautify_file(self, path): self.write_file(path, result) return error + def usage_ex(self,err_val): + sys.stderr.write('Usage: ' + sys.argv[0] + ' [-h|-t ] [|-]...\n') + sys.exit(err_val); + def main(self): + try: + opts,paths = getopt.getopt(sys.argv[1:], "ht:", "help") + except getopt.GetoptError as err: + print(err) + self.usage_ex(2) + + for o, v in opts: + if o == '-t': + self.tab_size = int(v) + elif o in ('-h', '--help'): + self.usage_ex(0) + + if(len(paths) < 1): + paths.append('-') + error = False - sys.argv.pop(0) - if(len(sys.argv) < 1): - sys.stderr.write( - 'usage: shell script filenames or \"-\" for stdin.\n') - else: - for path in sys.argv: - error |= self.beautify_file(path) + for path in paths: + error |= self.beautify_file(path) sys.exit((0, 1)[error]) # if not called as a module From fbc9de35babe48bee8d58fad0eb33c276935eb04 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Thu, 12 Jan 2017 08:57:32 +0530 Subject: [PATCH 02/36] Added a test --- test.sh | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100755 test.sh diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..c348e99 --- /dev/null +++ b/test.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +TEST1_in() +{ + cat <<"EOM" +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi +EOM +} + +TEST1_expected() +{ + cat <<"EOM" +echo +if [ $? -eq 0 ] +then + echo +else + echo +fi +EOM +} + +diff <(TEST1_in | python ./beautify_bash.py -t3 - ) <(TEST1_expected) && echo PASS From 5ac785e2d4c1dcbc46c62b7d835db275338917fd Mon Sep 17 00:00:00 2001 From: Shriram V Date: Thu, 12 Jan 2017 09:08:31 +0530 Subject: [PATCH 03/36] Added another test --- test.sh | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/test.sh b/test.sh index c348e99..f591416 100755 --- a/test.sh +++ b/test.sh @@ -1,5 +1,6 @@ #!/bin/bash +# simple if then else case TEST1_in() { cat <<"EOM" @@ -26,4 +27,44 @@ fi EOM } -diff <(TEST1_in | python ./beautify_bash.py -t3 - ) <(TEST1_expected) && echo PASS +# here docs +TEST2_in() +{ + cat <<"EOM" + cat <<"HEHE" + if [ + then + +HEHE +if [ $? -eq 0 ] + then + : + fi +EOM +} + +TEST2_expected() +{ + cat <<"EOM" +cat <<"HEHE" + if [ + then + +HEHE +if [ $? -eq 0 ] +then + : +fi +EOM +} + +N=2 +for (( i = 1 ; i <= $N ; ++i )) +do + if diff <(TEST${i}_in | python ./beautify_bash.py -t3 - ) <(TEST${i}_expected) + then + echo "TEST - $i of $N - PASS" + else + echo "TEST - $i of $N - FAIL" + fi +done From ae68c1fe4ece7e826e5bb5e7f5f0eb114c6fd618 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Fri, 13 Jan 2017 00:05:43 +0530 Subject: [PATCH 04/36] Removed unintended | char from within regex --- beautify_bash.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/beautify_bash.py b/beautify_bash.py index cf16722..d8665c9 100644 --- a/beautify_bash.py +++ b/beautify_bash.py @@ -69,8 +69,7 @@ def beautify_string(self, data, path=''): test_record = re.sub(r'(\A|\s)(#.*)', '', test_record, 1) if(not in_here_doc): if(re.search('<<-?', test_record)): - here_string = re.sub( - '.*<<-?\s*[\'|"]?([_|\w]+)[\'|"]?.*', '\\1', stripped_record, 1) + here_string = re.sub('.*<<-?\s*[\'"]?([\w]+)[\'"]?.*', '\\1', stripped_record, 1) in_here_doc = (len(here_string) > 0) if(in_here_doc): # pass on with no changes output.append(record) From 5ea34316ffd82fa653fcdb64ed6fcf5ce375d7ed Mon Sep 17 00:00:00 2001 From: Shriram V Date: Fri, 13 Jan 2017 00:14:11 +0530 Subject: [PATCH 05/36] Added test for elif --- test.sh | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/test.sh b/test.sh index f591416..a795bea 100755 --- a/test.sh +++ b/test.sh @@ -58,7 +58,34 @@ fi EOM } -N=2 +# elif +TEST3_in() +{ + cat <<"EOM" +if [ $? -eq 0 ] +then + : + elif [ $? -ne 0 ] + then + : +fi +EOM +} + +TEST3_expected() +{ + cat <<"EOM" +if [ $? -eq 0 ] +then + : +elif [ $? -ne 0 ] +then + : +fi +EOM +} + +N=3 for (( i = 1 ; i <= $N ; ++i )) do if diff <(TEST${i}_in | python ./beautify_bash.py -t3 - ) <(TEST${i}_expected) From 53f36d9daeb8263f48108486a530c96665b12cea Mon Sep 17 00:00:00 2001 From: Shriram V Date: Fri, 13 Jan 2017 09:56:36 +0530 Subject: [PATCH 06/36] Reorg tests and testcases --- run_tests.sh | 39 +++++++++++++++++++ test.sh | 97 ---------------------------------------------- testcases/test1.sh | 34 ++++++++++++++++ testcases/test2.sh | 46 ++++++++++++++++++++++ testcases/test3.sh | 34 ++++++++++++++++ 5 files changed, 153 insertions(+), 97 deletions(-) create mode 100755 run_tests.sh delete mode 100755 test.sh create mode 100644 testcases/test1.sh create mode 100644 testcases/test2.sh create mode 100644 testcases/test3.sh diff --git a/run_tests.sh b/run_tests.sh new file mode 100755 index 0000000..8831757 --- /dev/null +++ b/run_tests.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +ALL_TESTS=( $(echo ./testcases/*.sh) ) +TOTAL_TESTS=${#ALL_TESTS[@]}; + +for (( i = 0 ; i < $TOTAL_TESTS; ++i )) +do + test_file=${ALL_TESTS[$i]} + test_name="$(basename $test_file)" + + echo "=============================================================" + echo "TEST $test_name ($i of $TOTAL_TESTS):" + + e=0; + ( + CASES=1 + source $test_file + + e=0; + for (( cc = 1 ; cc <= $CASES ; ++cc )) + do + ( + e=0; + diff <(input$cc | python ./beautify_bash.py -t3 - ) <(expected$cc) || e=1 + + status=PASS && [ $e -ne 0 ] && status=FAIL + echo " CASE $cc of $CASES - $status" + exit $le; + ) || ((++e)) + done + + exit $e; + ) || ((++e)) + + status=PASS && [ $e -ne 0 ] && status=FAIL + echo + echo "TEST $test_name ($i of $TOTAL_TESTS): $status" + echo "=============================================================" +done diff --git a/test.sh b/test.sh deleted file mode 100755 index a795bea..0000000 --- a/test.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash - -# simple if then else case -TEST1_in() -{ - cat <<"EOM" -echo -if [ $? -eq 0 ] - then - echo - else - echo - fi -EOM -} - -TEST1_expected() -{ - cat <<"EOM" -echo -if [ $? -eq 0 ] -then - echo -else - echo -fi -EOM -} - -# here docs -TEST2_in() -{ - cat <<"EOM" - cat <<"HEHE" - if [ - then - -HEHE -if [ $? -eq 0 ] - then - : - fi -EOM -} - -TEST2_expected() -{ - cat <<"EOM" -cat <<"HEHE" - if [ - then - -HEHE -if [ $? -eq 0 ] -then - : -fi -EOM -} - -# elif -TEST3_in() -{ - cat <<"EOM" -if [ $? -eq 0 ] -then - : - elif [ $? -ne 0 ] - then - : -fi -EOM -} - -TEST3_expected() -{ - cat <<"EOM" -if [ $? -eq 0 ] -then - : -elif [ $? -ne 0 ] -then - : -fi -EOM -} - -N=3 -for (( i = 1 ; i <= $N ; ++i )) -do - if diff <(TEST${i}_in | python ./beautify_bash.py -t3 - ) <(TEST${i}_expected) - then - echo "TEST - $i of $N - PASS" - else - echo "TEST - $i of $N - FAIL" - fi -done diff --git a/testcases/test1.sh b/testcases/test1.sh new file mode 100644 index 0000000..39573ef --- /dev/null +++ b/testcases/test1.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +CASES=1 + +describe() +{ + echo "Basic if then else" +} + +input1() +{ + cat <<"EOM" +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi +EOM +} + +expected1() +{ + cat <<"EOM" +echo +if [ $? -eq 0 ] +then + echo +else + echo +fi +EOM +} diff --git a/testcases/test2.sh b/testcases/test2.sh new file mode 100644 index 0000000..1261a71 --- /dev/null +++ b/testcases/test2.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +CASES=1 + +describe() +{ + echo "here docs" +} + +input1() +{ + cat <<"EOM" + cat <<"HEHE" + if [ + then + +HEHEFOOLER + HEHE + if [ $? -eq 1 ] + then +HEHE +if [ $? -eq 0 ] + then + : + fi +EOM +} + +expected1() +{ + cat <<"EOM" +cat <<"HEHE" + if [ + then + +HEHEFOOLER + HEHE + if [ $? -eq 1 ] + then +HEHE +if [ $? -eq 0 ] +then + : +fi +EOM +} diff --git a/testcases/test3.sh b/testcases/test3.sh new file mode 100644 index 0000000..f66d44d --- /dev/null +++ b/testcases/test3.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +CASES=1 + +describe() +{ + echo "elif" +} + +input1() +{ + cat <<"EOM" +if [ $? -eq 0 ] +then + : + elif [ $? -ne 0 ] + then + : +fi +EOM +} + +expected1() +{ + cat <<"EOM" +if [ $? -eq 0 ] +then + : +elif [ $? -ne 0 ] +then + : +fi +EOM +} From fd1de93ed07f474fff28e10a195f9ec6e15ae392 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Fri, 13 Jan 2017 09:57:58 +0530 Subject: [PATCH 07/36] Fix for here docs ... if [ $? == 0 ] then cat < 0) + if(in_here_doc): # pass on with no changes output.append(record) # now test for here-doc termination string - if(re.search(here_string, test_record) and not re.search('<<', test_record)): + if(record == here_string): in_here_doc = False else: # not in here doc if(in_ext_quote): @@ -134,6 +131,9 @@ def beautify_string(self, data, path=''): defer_ext_quote = False if(re.search(r'\bcase\b', test_record)): case_stack.append(0) + if(re.search('<<-?', test_record)): + here_string = re.sub('.*<<-?\s*[\'"]?([\w]+)[\'"]?.*', '\\1', stripped_record, 1) + in_here_doc = (len(here_string) > 0) line += 1 error = (tab != 0) if(error): From 04b3c7136736ed4643851001d9da630c74da23fa Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sat, 14 Jan 2017 11:30:49 +0530 Subject: [PATCH 08/36] Added more tests --- run_tests.sh | 6 +-- testcases/test1.sh | 92 ++++++++++++++++++++++++++++++++- testcases/test2.sh | 124 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 217 insertions(+), 5 deletions(-) diff --git a/run_tests.sh b/run_tests.sh index 8831757..c77df2f 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -8,14 +8,14 @@ do test_file=${ALL_TESTS[$i]} test_name="$(basename $test_file)" - echo "=============================================================" - echo "TEST $test_name ($i of $TOTAL_TESTS):" - e=0; ( CASES=1 source $test_file + echo "=============================================================" + echo "TEST $test_name ($i of $TOTAL_TESTS): $(describe)" + e=0; for (( cc = 1 ; cc <= $CASES ; ++cc )) do diff --git a/testcases/test1.sh b/testcases/test1.sh index 39573ef..c4a7a01 100644 --- a/testcases/test1.sh +++ b/testcases/test1.sh @@ -1,6 +1,6 @@ #!/bin/bash -CASES=1 +CASES=4 describe() { @@ -32,3 +32,93 @@ else fi EOM } + +input2() +{ + cat <<"EOM" + func() { +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi + } +EOM +} + +expected2() +{ + cat <<"EOM" +func() { + echo + if [ $? -eq 0 ] + then + echo + else + echo + fi +} +EOM +} + +input3() +{ + cat <<"EOM" + func() + { +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi + } +EOM +} + +expected3() +{ + cat <<"EOM" +func() +{ + echo + if [ $? -eq 0 ] + then + echo + else + echo + fi +} +EOM +} + +input4() +{ + cat <<"EOM" + func() + { +echo +if [ $? -eq 0 ]; then echo + else + echo + fi + } +EOM +} + +expected4() +{ + cat <<"EOM" +func() +{ + echo + if [ $? -eq 0 ]; then echo + else + echo + fi +} +EOM +} diff --git a/testcases/test2.sh b/testcases/test2.sh index 1261a71..eb1e5bc 100644 --- a/testcases/test2.sh +++ b/testcases/test2.sh @@ -1,6 +1,6 @@ #!/bin/bash -CASES=1 +CASES=4 describe() { @@ -44,3 +44,125 @@ then fi EOM } + +input2() +{ + cat <<"EOM" + cat < Date: Sat, 14 Jan 2017 13:25:32 +0530 Subject: [PATCH 09/36] Fixed test error reporting --- run_tests.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/run_tests.sh b/run_tests.sh index c77df2f..28e83f0 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -19,13 +19,16 @@ do e=0; for (( cc = 1 ; cc <= $CASES ; ++cc )) do + echo "-------------------------------------------------------------" + input$cc + echo "-------------------------------------------------------------" ( e=0; - diff <(input$cc | python ./beautify_bash.py -t3 - ) <(expected$cc) || e=1 + diff "$@" <(input$cc | python ./beautify_bash.py -t3 - ) <(expected$cc) || e=1 status=PASS && [ $e -ne 0 ] && status=FAIL echo " CASE $cc of $CASES - $status" - exit $le; + exit $e; ) || ((++e)) done From dacd065e037d273a31f63cc532882a999ab1b8a6 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sat, 14 Jan 2017 13:25:44 +0530 Subject: [PATCH 10/36] Added tests for quotes --- testcases/test4.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 testcases/test4.sh diff --git a/testcases/test4.sh b/testcases/test4.sh new file mode 100644 index 0000000..255ef6d --- /dev/null +++ b/testcases/test4.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +CASES=1 + +describe() +{ + echo "string literals" +} + +input1() +{ + cat <<"EOM" +func() { + X1="This is a 'test' about quotes" + X2='This is a "test" about quotes' + Y1="This + is a 'te + quotes" + Y2='This + is a "te + quotes' +} +EOM +} + +expected1() +{ + cat <<"EOM" +func() { + X1="This is a 'test' about quotes" + X2='This is a "test" about quotes' + Y1="This + is a 'te + quotes" + Y2='This + is a "te + quotes' +} +EOM +} From e686d7766ae7fc11ec6bb8f34162b52e3523a475 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sun, 15 Jan 2017 10:14:28 +0530 Subject: [PATCH 11/36] Remove archaic folding at 80 chars for better readability --- beautify_bash.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/beautify_bash.py b/beautify_bash.py index 9116c11..e1b64da 100644 --- a/beautify_bash.py +++ b/beautify_bash.py @@ -77,34 +77,26 @@ def beautify_string(self, data, path=''): if(in_ext_quote): if(re.search(ext_quote_string, test_record)): # provide line after quotes - test_record = re.sub( - '.*%s(.*)' % ext_quote_string, '\\1', test_record, 1) + test_record = re.sub('.*%s(.*)' % ext_quote_string, '\\1', test_record, 1) in_ext_quote = False else: # not in ext quote if(re.search(r'(\A|\s)(\'|")', test_record)): # apply only after this line has been processed defer_ext_quote = True - ext_quote_string = re.sub( - '.*([\'"]).*', '\\1', test_record, 1) + ext_quote_string = re.sub('.*([\'"]).*', '\\1', test_record, 1) # provide line before quote - test_record = re.sub( - '(.*)%s.*' % ext_quote_string, '\\1', test_record, 1) + test_record = re.sub('(.*)%s.*' % ext_quote_string, '\\1', test_record, 1) if(in_ext_quote): # pass on unchanged output.append(record) else: # not in ext quote - inc = len(re.findall( - '(\s|\A|;)(case|then|do)(;|\Z|\s)', test_record)) + inc = len(re.findall('(\s|\A|;)(case|then|do)(;|\Z|\s)', test_record)) inc += len(re.findall('(\{|\(|\[)', test_record)) - outc = len(re.findall( - '(\s|\A|;)(esac|fi|done|elif)(;|\)|\||\Z|\s)', test_record)) + outc = len(re.findall('(\s|\A|;)(esac|fi|done|elif)(;|\)|\||\Z|\s)', test_record)) outc += len(re.findall('(\}|\)|\])', test_record)) if(re.search(r'\besac\b', test_record)): if(len(case_stack) == 0): - sys.stderr.write( - 'File %s: error: "esac" before "case" in line %d.\n' % ( - path, line) - ) + sys.stderr.write('File %s: error: "esac" before "case" in line %d.\n' % (path, line)) else: outc += case_stack.pop() # sepcial handling for bad syntax within case ... esac @@ -117,14 +109,12 @@ def beautify_string(self, data, path=''): outc += 1 case_stack[-1] -= 1 # an ad-hoc solution for the "else" keyword - else_case = ( - 0, -1)[re.search('^(else)', test_record) != None] + else_case = (0, -1)[re.search('^(else)', test_record) != None] net = inc - outc tab += min(net, 0) extab = tab + else_case extab = max(0, extab) - output.append( - (self.tab_str * self.tab_size * extab) + stripped_record) + output.append((self.tab_str * self.tab_size * extab) + stripped_record) tab += max(net, 0) if(defer_ext_quote): in_ext_quote = True @@ -137,8 +127,7 @@ def beautify_string(self, data, path=''): line += 1 error = (tab != 0) if(error): - sys.stderr.write( - 'File %s: error: indent/outdent mismatch: %d.\n' % (path, tab)) + sys.stderr.write('File %s: error: indent/outdent mismatch: %d.\n' % (path, tab)) return '\n'.join(output), error def beautify_file(self, path): From 94989b31cc0283c90f98d1aec4f7c97f46360e06 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sun, 15 Jan 2017 23:49:40 +0530 Subject: [PATCH 12/36] Pretty printing of tests --- run_tests.sh | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/run_tests.sh b/run_tests.sh index 28e83f0..d832598 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -2,6 +2,8 @@ ALL_TESTS=( $(echo ./testcases/*.sh) ) TOTAL_TESTS=${#ALL_TESTS[@]}; +PASSED=0 +FAILED=0 for (( i = 0 ; i < $TOTAL_TESTS; ++i )) do @@ -14,20 +16,28 @@ do source $test_file echo "=============================================================" - echo "TEST $test_name ($i of $TOTAL_TESTS): $(describe)" + echo "TEST $test_name ($((i+1)) of $TOTAL_TESTS): $(describe)" + echo + chr=' ' e=0; for (( cc = 1 ; cc <= $CASES ; ++cc )) do - echo "-------------------------------------------------------------" - input$cc - echo "-------------------------------------------------------------" + echo " CASE $cc of $CASES:" + echo " -------------------------------------------------------------" + echo " inp:" + input$cc | tee /tmp/input.txt | sed -e 's/^/ /' | sed -e "s/ /$chr/g" + echo " -------------------------------------------------------------" + ( e=0; - diff "$@" <(input$cc | python ./beautify_bash.py -t3 - ) <(expected$cc) || e=1 + echo " got: exp:" + diff -y <(input$cc | python ./beautify_bash.py -t3 - | sed -e "s/ /$chr/g" | sed -e 's/^/ /') <(expected$cc | sed -e "s/ /$chr/g" | sed -e 's/^/ /') || e=1 status=PASS && [ $e -ne 0 ] && status=FAIL + echo " -------------------------------------------------------------" echo " CASE $cc of $CASES - $status" + echo exit $e; ) || ((++e)) done @@ -35,8 +45,15 @@ do exit $e; ) || ((++e)) + [ $e -eq 0 ] && (( PASSED++ )) + [ $e -ne 0 ] && (( FAILED++ )) + status=PASS && [ $e -ne 0 ] && status=FAIL echo - echo "TEST $test_name ($i of $TOTAL_TESTS): $status" + echo "TEST $test_name ($((i+1)) of $TOTAL_TESTS): $status" echo "=============================================================" done + +echo "=============================================================" +echo "TEST SUMMARY : PASSED: $PASSED, FAILED: $FAILED" +echo "=============================================================" From 9e8d5a47a48cfed307dcca7b1ff0f21abf32c8e5 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sun, 15 Jan 2017 23:50:34 +0530 Subject: [PATCH 13/36] Added trailing spaces in test cases --- testcases/test1.sh | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/testcases/test1.sh b/testcases/test1.sh index c4a7a01..6311221 100644 --- a/testcases/test1.sh +++ b/testcases/test1.sh @@ -10,13 +10,13 @@ describe() input1() { cat <<"EOM" -echo -if [ $? -eq 0 ] - then - echo - else - echo - fi +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi EOM } @@ -36,15 +36,15 @@ EOM input2() { cat <<"EOM" - func() { -echo -if [ $? -eq 0 ] - then - echo - else - echo - fi - } + func() { +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi + } EOM } @@ -71,7 +71,7 @@ input3() echo if [ $? -eq 0 ] then - echo +echo else echo fi From 07fe4f0ed498b387dfe18de7994772c91a399902 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sun, 15 Jan 2017 23:50:53 +0530 Subject: [PATCH 14/36] Added a few test w.r.to quotes --- testcases/test4.sh | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/testcases/test4.sh b/testcases/test4.sh index 255ef6d..919fb1e 100644 --- a/testcases/test4.sh +++ b/testcases/test4.sh @@ -1,6 +1,6 @@ #!/bin/bash -CASES=1 +CASES=2 describe() { @@ -11,14 +11,18 @@ input1() { cat <<"EOM" func() { - X1="This is a 'test' about quotes" - X2='This is a "test" about quotes' + X1="This is a 'test' about quotes" + X2='This is a "test" about quotes' Y1="This is a 'te quotes" Y2='This is a "te quotes' + Y3="This + is a \"te + quotes" + echo } EOM } @@ -35,6 +39,34 @@ func() { Y2='This is a "te quotes' + Y3="This + is a \"te + quotes" + echo +} +EOM +} + +input2() +{ + cat <<"EOM" +func() { + Y1="This + this is < Date: Sun, 15 Jan 2017 23:51:08 +0530 Subject: [PATCH 15/36] 1. Indentation fixes to support quoted strings - Restructured the if conditions using "continue" instead of complex if-else ladder - (at the risk of a few unknown regressions) - Remove in_here_doc flag, instead directly depend on here_string - Remove in_ext_quote flag, instead directly depend on ext_quote_string - Removed defer_ext_quote flag Now: func() { Y1="This---------- this is < 0): - if(re.search('\A[^(]*\)', test_record)): - # avoid overcount - outc -= 2 - case_stack[-1] += 1 - if(re.search(';;', test_record)): - outc += 1 - case_stack[-1] -= 1 - # an ad-hoc solution for the "else" keyword - else_case = (0, -1)[re.search('^(else)', test_record) != None] - net = inc - outc - tab += min(net, 0) - extab = tab + else_case - extab = max(0, extab) - output.append((self.tab_str * self.tab_size * extab) + stripped_record) - tab += max(net, 0) - if(defer_ext_quote): - in_ext_quote = True - defer_ext_quote = False - if(re.search(r'\bcase\b', test_record)): - case_stack.append(0) - if(re.search('<<-?', test_record)): - here_string = re.sub('.*<<-?\s*[\'"]?([\w]+)[\'"]?.*', '\\1', stripped_record, 1) - in_here_doc = (len(here_string) > 0) + continue + + if(re.search(r'[\'"]', test_record)): + # apply only after this line has been processed + ext_quote_string = re.sub('[^\'"]*([\'"]).*', '\\1', test_record, 1) + # provide line before quote + test_record = re.sub('(.*)%s.*' % ext_quote_string, '\\1', test_record, 1) + stripped_record = record.lstrip(); + + inc = len(re.findall('(\s|\A|;)(case|then|do)(;|\Z|\s)', test_record)) + inc += len(re.findall('(\{|\(|\[)', test_record)) + outc = len(re.findall('(\s|\A|;)(esac|fi|done|elif)(;|\)|\||\Z|\s)', test_record)) + outc += len(re.findall('(\}|\)|\])', test_record)) + + if(re.search(r'\besac\b', test_record)): + if(len(case_stack) == 0): + sys.stderr.write('File %s: error: "esac" before "case" in line %d.\n' % (path, line)) + else: + outc += case_stack.pop() + + # sepcial handling for bad syntax within case ... esac + if(len(case_stack) > 0): + if(re.search('\A[^(]*\)', test_record)): + # avoid overcount + outc -= 2 + case_stack[-1] += 1 + if(re.search(';;', test_record)): + outc += 1 + case_stack[-1] -= 1 + + # an ad-hoc solution for the "else" keyword + else_case = (0, -1)[re.search('^(else)', test_record) != None] + + net = inc - outc + tab += min(net, 0) + extab = tab + else_case + extab = max(0, extab) + tab += max(net, 0) + + output.append((self.tab_str * self.tab_size * extab) + stripped_record); + + if(re.search(r'\bcase\b', test_record)): + case_stack.append(0) + if(re.search('<<-?', test_record)): + here_string = re.sub('.*<<-?\s*[\'"]?([\w]+)[\'"]?.*', '\\1', record.strip(), 1) + line += 1 error = (tab != 0) if(error): From 5dea11b83c06927bed9e5e3205e0f62ffb9f089d Mon Sep 17 00:00:00 2001 From: Shriram V Date: Mon, 16 Jan 2017 07:05:41 +0530 Subject: [PATCH 16/36] Wrap lines ending with \, ||, &&, | The following: func() { echo alpha \ beta \ gamma \ delata echo echo a | grep x | grep y | grep p echo echo a && grep x && grep y && grep p echo echo a || grep x || grep y || grep p echo } Will indent as below: func() { echo alpha \ beta \ gamma \ delata echo echo a | grep x | grep y | grep p echo echo a && grep x && grep y && grep p echo echo a || grep x || grep y || grep p echo } --- beautify_bash.py | 11 +++++++- testcases/test5.sh | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 testcases/test5.sh diff --git a/beautify_bash.py b/beautify_bash.py index 1facad4..48255f9 100644 --- a/beautify_bash.py +++ b/beautify_bash.py @@ -43,6 +43,7 @@ def write_file(self, fp, data): def beautify_string(self, data, path=''): tab = 0 + wrap_tab = "" case_stack = [] ext_quote_string = '' here_string = '' @@ -119,7 +120,15 @@ def beautify_string(self, data, path=''): extab = max(0, extab) tab += max(net, 0) - output.append((self.tab_str * self.tab_size * extab) + stripped_record); + output.append((self.tab_str * self.tab_size * extab) + wrap_tab + stripped_record); + + if(re.search(r'\\\s*$', test_record) + or re.search(r'[&][&]\s*$', test_record) + or re.search(r'[|]\s*$', test_record) + ): + wrap_tab = self.tab_str * self.tab_size + else: + wrap_tab = "" if(re.search(r'\bcase\b', test_record)): case_stack.append(0) diff --git a/testcases/test5.sh b/testcases/test5.sh new file mode 100644 index 0000000..b4783e3 --- /dev/null +++ b/testcases/test5.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +CASES=1 + +describe() +{ + echo "line wrapping when ending with \\, &&, |, ||" +} + +input1() +{ + cat <<"EOM" +func() { + echo alpha \ + beta \ + gamma \ + delata + echo + echo a | + grep x | + grep y | + grep z | + grep p + echo + echo a && + grep x && + grep y && + grep z && + grep p + echo + echo a || + grep x || + grep y || + grep z || + grep p + echo +} +EOM +} + +expected1() +{ + cat <<"EOM" +func() { + echo alpha \ + beta \ + gamma \ + delata + echo + echo a | + grep x | + grep y | + grep z | + grep p + echo + echo a && + grep x && + grep y && + grep z && + grep p + echo + echo a || + grep x || + grep y || + grep z || + grep p + echo +} +EOM +} From cf94559a9b321a3f2e623b203e02e683937ca19b Mon Sep 17 00:00:00 2001 From: Shriram V Date: Mon, 16 Jan 2017 07:22:16 +0530 Subject: [PATCH 17/36] Trim intervening lines with containing only spaces --- beautify_bash.py | 5 ++++- testcases/test6.sh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 testcases/test6.sh diff --git a/beautify_bash.py b/beautify_bash.py index 48255f9..dbaa584 100644 --- a/beautify_bash.py +++ b/beautify_bash.py @@ -120,7 +120,10 @@ def beautify_string(self, data, path=''): extab = max(0, extab) tab += max(net, 0) - output.append((self.tab_str * self.tab_size * extab) + wrap_tab + stripped_record); + if(re.search(r'^\s*$', stripped_record) and wrap_tab == ""): + output.append(""); + else: + output.append((self.tab_str * self.tab_size * extab) + wrap_tab + stripped_record); if(re.search(r'\\\s*$', test_record) or re.search(r'[&][&]\s*$', test_record) diff --git a/testcases/test6.sh b/testcases/test6.sh new file mode 100644 index 0000000..1592cbe --- /dev/null +++ b/testcases/test6.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +CASES=1 + +describe() +{ + echo "trim lines with empty spaces" +} + +input1() +{ + cat <<"EOM" + func() { + echo + + echo + } +EOM +} + +expected1() +{ + cat <<"EOM" +func() { + echo + + echo +} +EOM +} From 810bb9bad80b30b1858f863f6de3268e763e478b Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sat, 21 Jan 2017 12:08:35 +0530 Subject: [PATCH 18/36] Removed a few issues highlighted by pep8 (pep8 --max-line-length=150) --- beautify_bash.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/beautify_bash.py b/beautify_bash.py index dbaa584..53d49e4 100644 --- a/beautify_bash.py +++ b/beautify_bash.py @@ -88,7 +88,7 @@ def beautify_string(self, data, path=''): ext_quote_string = re.sub('[^\'"]*([\'"]).*', '\\1', test_record, 1) # provide line before quote test_record = re.sub('(.*)%s.*' % ext_quote_string, '\\1', test_record, 1) - stripped_record = record.lstrip(); + stripped_record = record.lstrip() inc = len(re.findall('(\s|\A|;)(case|then|do)(;|\Z|\s)', test_record)) inc += len(re.findall('(\{|\(|\[)', test_record)) @@ -112,7 +112,7 @@ def beautify_string(self, data, path=''): case_stack[-1] -= 1 # an ad-hoc solution for the "else" keyword - else_case = (0, -1)[re.search('^(else)', test_record) != None] + else_case = (0, -1)[re.search('^(else)', test_record) is not None] net = inc - outc tab += min(net, 0) @@ -121,14 +121,14 @@ def beautify_string(self, data, path=''): tab += max(net, 0) if(re.search(r'^\s*$', stripped_record) and wrap_tab == ""): - output.append(""); + output.append("") else: - output.append((self.tab_str * self.tab_size * extab) + wrap_tab + stripped_record); + output.append((self.tab_str * self.tab_size * extab) + wrap_tab + stripped_record) if(re.search(r'\\\s*$', test_record) or re.search(r'[&][&]\s*$', test_record) or re.search(r'[|]\s*$', test_record) - ): + ): wrap_tab = self.tab_str * self.tab_size else: wrap_tab = "" @@ -159,13 +159,13 @@ def beautify_file(self, path): self.write_file(path, result) return error - def usage_ex(self,err_val): + def usage_ex(self, err_val): sys.stderr.write('Usage: ' + sys.argv[0] + ' [-h|-t ] [|-]...\n') - sys.exit(err_val); + sys.exit(err_val) def main(self): try: - opts,paths = getopt.getopt(sys.argv[1:], "ht:", "help") + opts, paths = getopt.getopt(sys.argv[1:], "ht:", "help") except getopt.GetoptError as err: print(err) self.usage_ex(2) From d25d45c343d439374a736be1ac9127a0c1f68edd Mon Sep 17 00:00:00 2001 From: Shriram V Date: Fri, 9 Jun 2017 10:11:58 -0400 Subject: [PATCH 19/36] Experimenting with travis --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..2cb2554 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +install: true + +script: + - ./run_tests.sh From 132cced7667d2f512ba1edec521d8d9dcc0e8c6b Mon Sep 17 00:00:00 2001 From: Shriram V Date: Fri, 9 Jun 2017 10:13:06 -0400 Subject: [PATCH 20/36] Testing travis --- test | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test diff --git a/test b/test new file mode 100644 index 0000000..e69de29 From bce10e01e436645c2224d92d3082019e40d0c885 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Fri, 9 Jun 2017 10:19:36 -0400 Subject: [PATCH 21/36] Testing travis --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2cb2554..3fb95de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ +language: python + install: true script: From f823917030bd446b1a88f1110b9654bd6c542625 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 04:26:06 -0500 Subject: [PATCH 22/36] Test using perl tap --- run_tests.sh | 2 + t/10.t | 106 ++++++++++++++++++++++++++++++++++++ t/20.t | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++ t/30.t | 36 +++++++++++++ t/40.t | 67 +++++++++++++++++++++++ t/50.t | 72 +++++++++++++++++++++++++ t/60.t | 32 +++++++++++ t/base.pm | 18 +++++++ 8 files changed, 482 insertions(+) create mode 100644 t/10.t create mode 100644 t/20.t create mode 100644 t/30.t create mode 100644 t/40.t create mode 100644 t/50.t create mode 100644 t/60.t create mode 100644 t/base.pm diff --git a/run_tests.sh b/run_tests.sh index d832598..8e740e7 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -1,5 +1,7 @@ #!/bin/bash +prove -f + ALL_TESTS=( $(echo ./testcases/*.sh) ) TOTAL_TESTS=${#ALL_TESTS[@]}; PASSED=0 diff --git a/t/10.t b/t/10.t new file mode 100644 index 0000000..d9e7c84 --- /dev/null +++ b/t/10.t @@ -0,0 +1,106 @@ +#!perl -T + +use Test::More tests => 4; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else'; +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi +EOM +echo +if [ $? -eq 0 ] +then + echo +else + echo +fi + +EOM + +eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else, in func staircase'; + func() { +echo +if [ $? -eq 0 ] + then + echo + else + echo + fi + } +EOM +func() { + echo + if [ $? -eq 0 ] + then + echo + else + echo + fi +} + +EOM + +eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else, in func'; + func() + { +echo +if [ $? -eq 0 ] + then +echo + else + echo + fi + } +EOM +func() +{ + echo + if [ $? -eq 0 ] + then + echo + else + echo + fi +} + +EOM + +eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else, in func, if/then oneline'; + func() + { +echo +if [ $? -eq 0 ]; then echo + else + echo + fi + } +EOM +func() +{ + echo + if [ $? -eq 0 ]; then echo + else + echo + fi +} + +EOM + diff --git a/t/20.t b/t/20.t new file mode 100644 index 0000000..a1789f2 --- /dev/null +++ b/t/20.t @@ -0,0 +1,149 @@ +#!perl -T + +use Test::More tests => 4; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'Here doc'; + cat <<"HEHE" + if [ + then + +HEHEFOOLER + HEHE + if [ $? -eq 1 ] + then +HEHE +if [ $? -eq 0 ] + then + : + fi +EOM +cat <<"HEHE" + if [ + then + +HEHEFOOLER + HEHE + if [ $? -eq 1 ] + then +HEHE +if [ $? -eq 0 ] +then + : +fi + +EOM + +eq_or_diff a(<<'EOM'), <<'EOM', 'Here doc'; + cat < 1; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'elif'; +if [ $? -eq 0 ] +then + : + elif [ $? -ne 0 ] + then + : +fi +EOM +if [ $? -eq 0 ] +then + : +elif [ $? -ne 0 ] +then + : +fi + +EOM diff --git a/t/40.t b/t/40.t new file mode 100644 index 0000000..ccdab15 --- /dev/null +++ b/t/40.t @@ -0,0 +1,67 @@ +#!perl -T + +use Test::More tests => 2; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'String literals'; +func() { + X1="This is a 'test' about quotes" + X2='This is a "test" about quotes' + Y1="This + is a 'te + quotes" + Y2='This + is a "te + quotes' + Y3="This + is a \"te + quotes" + echo +} +EOM +func() { + X1="This is a 'test' about quotes" + X2='This is a "test" about quotes' + Y1="This + is a 'te + quotes" + Y2='This + is a "te + quotes' + Y3="This + is a \"te + quotes" + echo +} + +EOM + +eq_or_diff a(<<'EOM'), <<'EOM', 'String literals, fake here doc'; +func() { + Y1="This + this is < 1; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'line wrapping when ending with \\, &&, |, ||'; +func() { + echo alpha \ + beta \ + gamma \ + delata + echo + echo a | + grep x | + grep y | + grep z | + grep p + echo + echo a && + grep x && + grep y && + grep z && + grep p + echo + echo a || + grep x || + grep y || + grep z || + grep p + echo +} +EOM +func() { + echo alpha \ + beta \ + gamma \ + delata + echo + echo a | + grep x | + grep y | + grep z | + grep p + echo + echo a && + grep x && + grep y && + grep z && + grep p + echo + echo a || + grep x || + grep y || + grep z || + grep p + echo +} + +EOM diff --git a/t/60.t b/t/60.t new file mode 100644 index 0000000..e877271 --- /dev/null +++ b/t/60.t @@ -0,0 +1,32 @@ +#!perl -T + +use Test::More tests => 1; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'Trim lines with empty spaces'; + func() { + echo + + echo + } +EOM +func() { + echo + + echo +} + +EOM diff --git a/t/base.pm b/t/base.pm new file mode 100644 index 0000000..a6dee0b --- /dev/null +++ b/t/base.pm @@ -0,0 +1,18 @@ +#!perl -T + +use Test::More tests => 4; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + From 3174d7eb3e2660161f52fb72d8d774b51eeac579 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 04:29:40 -0500 Subject: [PATCH 23/36] Show build status --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 984a4db..6d09b1d 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ beautify_bash Code formatter / beautifier for bash written in python by Paul Lutus (a remake of previous version in Ruby). +[![Build Status](https://travis-ci.org/cheako/beautify_bash.svg)](https://travis-ci.org/cheako/beautify_bash) + For further details please see the following blog record http://arachnoid.com/python/beautify_bash_program.html From 94d3080018548e3b46260f6d55e043a65b3c8436 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 11:32:27 -0500 Subject: [PATCH 24/36] Remove old testcases --- .travis.yml | 2 +- run_tests.sh | 61 ---------------- testcases/test1.sh | 124 --------------------------------- testcases/test2.sh | 168 --------------------------------------------- testcases/test3.sh | 34 --------- testcases/test4.sh | 72 ------------------- testcases/test5.sh | 70 ------------------- testcases/test6.sh | 30 -------- 8 files changed, 1 insertion(+), 560 deletions(-) delete mode 100755 run_tests.sh delete mode 100644 testcases/test1.sh delete mode 100644 testcases/test2.sh delete mode 100644 testcases/test3.sh delete mode 100644 testcases/test4.sh delete mode 100644 testcases/test5.sh delete mode 100644 testcases/test6.sh diff --git a/.travis.yml b/.travis.yml index 3fb95de..e02173a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,4 @@ language: python install: true script: - - ./run_tests.sh + - prove -f diff --git a/run_tests.sh b/run_tests.sh deleted file mode 100755 index 8e740e7..0000000 --- a/run_tests.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -prove -f - -ALL_TESTS=( $(echo ./testcases/*.sh) ) -TOTAL_TESTS=${#ALL_TESTS[@]}; -PASSED=0 -FAILED=0 - -for (( i = 0 ; i < $TOTAL_TESTS; ++i )) -do - test_file=${ALL_TESTS[$i]} - test_name="$(basename $test_file)" - - e=0; - ( - CASES=1 - source $test_file - - echo "=============================================================" - echo "TEST $test_name ($((i+1)) of $TOTAL_TESTS): $(describe)" - echo - - chr=' ' - e=0; - for (( cc = 1 ; cc <= $CASES ; ++cc )) - do - echo " CASE $cc of $CASES:" - echo " -------------------------------------------------------------" - echo " inp:" - input$cc | tee /tmp/input.txt | sed -e 's/^/ /' | sed -e "s/ /$chr/g" - echo " -------------------------------------------------------------" - - ( - e=0; - echo " got: exp:" - diff -y <(input$cc | python ./beautify_bash.py -t3 - | sed -e "s/ /$chr/g" | sed -e 's/^/ /') <(expected$cc | sed -e "s/ /$chr/g" | sed -e 's/^/ /') || e=1 - - status=PASS && [ $e -ne 0 ] && status=FAIL - echo " -------------------------------------------------------------" - echo " CASE $cc of $CASES - $status" - echo - exit $e; - ) || ((++e)) - done - - exit $e; - ) || ((++e)) - - [ $e -eq 0 ] && (( PASSED++ )) - [ $e -ne 0 ] && (( FAILED++ )) - - status=PASS && [ $e -ne 0 ] && status=FAIL - echo - echo "TEST $test_name ($((i+1)) of $TOTAL_TESTS): $status" - echo "=============================================================" -done - -echo "=============================================================" -echo "TEST SUMMARY : PASSED: $PASSED, FAILED: $FAILED" -echo "=============================================================" diff --git a/testcases/test1.sh b/testcases/test1.sh deleted file mode 100644 index 6311221..0000000 --- a/testcases/test1.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/bash - -CASES=4 - -describe() -{ - echo "Basic if then else" -} - -input1() -{ - cat <<"EOM" -echo -if [ $? -eq 0 ] - then - echo - else - echo - fi -EOM -} - -expected1() -{ - cat <<"EOM" -echo -if [ $? -eq 0 ] -then - echo -else - echo -fi -EOM -} - -input2() -{ - cat <<"EOM" - func() { -echo -if [ $? -eq 0 ] - then - echo - else - echo - fi - } -EOM -} - -expected2() -{ - cat <<"EOM" -func() { - echo - if [ $? -eq 0 ] - then - echo - else - echo - fi -} -EOM -} - -input3() -{ - cat <<"EOM" - func() - { -echo -if [ $? -eq 0 ] - then -echo - else - echo - fi - } -EOM -} - -expected3() -{ - cat <<"EOM" -func() -{ - echo - if [ $? -eq 0 ] - then - echo - else - echo - fi -} -EOM -} - -input4() -{ - cat <<"EOM" - func() - { -echo -if [ $? -eq 0 ]; then echo - else - echo - fi - } -EOM -} - -expected4() -{ - cat <<"EOM" -func() -{ - echo - if [ $? -eq 0 ]; then echo - else - echo - fi -} -EOM -} diff --git a/testcases/test2.sh b/testcases/test2.sh deleted file mode 100644 index eb1e5bc..0000000 --- a/testcases/test2.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/bash - -CASES=4 - -describe() -{ - echo "here docs" -} - -input1() -{ - cat <<"EOM" - cat <<"HEHE" - if [ - then - -HEHEFOOLER - HEHE - if [ $? -eq 1 ] - then -HEHE -if [ $? -eq 0 ] - then - : - fi -EOM -} - -expected1() -{ - cat <<"EOM" -cat <<"HEHE" - if [ - then - -HEHEFOOLER - HEHE - if [ $? -eq 1 ] - then -HEHE -if [ $? -eq 0 ] -then - : -fi -EOM -} - -input2() -{ - cat <<"EOM" - cat < Date: Mon, 10 Jul 2017 11:34:43 -0500 Subject: [PATCH 25/36] Install differences --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index e02173a..f0206e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,5 +2,10 @@ language: python install: true +addons: + apt: + packages: + - libtest-differences-perl + script: - prove -f From 7c3f30e99d9c59733a861d989b30cd20a5c5a083 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 11:35:40 -0500 Subject: [PATCH 26/36] Remove misc files --- t/base.pm | 18 ------------------ test | 0 2 files changed, 18 deletions(-) delete mode 100644 t/base.pm delete mode 100644 test diff --git a/t/base.pm b/t/base.pm deleted file mode 100644 index a6dee0b..0000000 --- a/t/base.pm +++ /dev/null @@ -1,18 +0,0 @@ -#!perl -T - -use Test::More tests => 4; - -BEGIN { - if (!eval q{ use Test::Differences; 1 }) { - *eq_or_diff = \&is_deeply; - } -} - -delete $ENV{PATH}; - -sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" -$_[0] -EOM` -} - diff --git a/test b/test deleted file mode 100644 index e69de29..0000000 From 9cc1646812add138153b31b95cf9403cc5180d8e Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 11:57:46 -0500 Subject: [PATCH 27/36] Add an installer --- .travis.yml | 2 +- Makfile | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 Makfile diff --git a/.travis.yml b/.travis.yml index f0206e2..288a402 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,4 +8,4 @@ addons: - libtest-differences-perl script: - - prove -f + - make test diff --git a/Makfile b/Makfile new file mode 100644 index 0000000..0e9d2c6 --- /dev/null +++ b/Makfile @@ -0,0 +1,9 @@ +all: + +install: + install -D beautify_bash.py $(DESTDIR)/usr/bin/beautify_bash + +test: + prove -f + +.PHONY: all install test From dbd8938fff38c1f02e14f8cae7468c7b96109d5f Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 12:04:48 -0500 Subject: [PATCH 28/36] Rename tests --- t/{10.t => basic.t} | 8 ++++---- t/{30.t => elfi.t} | 0 t/{20.t => heredoc.t} | 0 t/{40.t => literals.t} | 0 t/{60.t => trim.t} | 2 +- t/{50.t => wrapping.t} | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename t/{10.t => basic.t} (82%) rename t/{30.t => elfi.t} (100%) rename t/{20.t => heredoc.t} (100%) rename t/{40.t => literals.t} (100%) rename t/{60.t => trim.t} (85%) rename t/{50.t => wrapping.t} (93%) diff --git a/t/10.t b/t/basic.t similarity index 82% rename from t/10.t rename to t/basic.t index d9e7c84..b32791d 100644 --- a/t/10.t +++ b/t/basic.t @@ -16,7 +16,7 @@ $_[0] EOM` } -eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else'; +eq_or_diff a(<<'EOM'), <<'EOM', 'If then else'; echo if [ $? -eq 0 ] then @@ -35,7 +35,7 @@ fi EOM -eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else, in func staircase'; +eq_or_diff a(<<'EOM'), <<'EOM', 'If then else, in func staircase'; func() { echo if [ $? -eq 0 ] @@ -58,7 +58,7 @@ func() { EOM -eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else, in func'; +eq_or_diff a(<<'EOM'), <<'EOM', 'If then else, in func'; func() { echo @@ -83,7 +83,7 @@ func() EOM -eq_or_diff a(<<'EOM'), <<'EOM', 'Basic if then else, in func, if/then oneline'; +eq_or_diff a(<<'EOM'), <<'EOM', 'If then else, in func, if/then oneline'; func() { echo diff --git a/t/30.t b/t/elfi.t similarity index 100% rename from t/30.t rename to t/elfi.t diff --git a/t/20.t b/t/heredoc.t similarity index 100% rename from t/20.t rename to t/heredoc.t diff --git a/t/40.t b/t/literals.t similarity index 100% rename from t/40.t rename to t/literals.t diff --git a/t/60.t b/t/trim.t similarity index 85% rename from t/60.t rename to t/trim.t index e877271..cb3b976 100644 --- a/t/60.t +++ b/t/trim.t @@ -16,7 +16,7 @@ $_[0] EOM` } -eq_or_diff a(<<'EOM'), <<'EOM', 'Trim lines with empty spaces'; +eq_or_diff a(<<'EOM'), <<'EOM', 'Lines with empty spaces'; func() { echo diff --git a/t/50.t b/t/wrapping.t similarity index 93% rename from t/50.t rename to t/wrapping.t index 3a7ae64..42f07bf 100644 --- a/t/50.t +++ b/t/wrapping.t @@ -16,7 +16,7 @@ $_[0] EOM` } -eq_or_diff a(<<'EOM'), <<'EOM', 'line wrapping when ending with \\, &&, |, ||'; +eq_or_diff a(<<'EOM'), <<'EOM', 'lines ending with \\, &&, |, ||'; func() { echo alpha \ beta \ From 4092d128975a7922da899a7765b18a1515940b62 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 12:15:13 -0500 Subject: [PATCH 29/36] Wrong file name --- Makfile => Makefile | 1 + 1 file changed, 1 insertion(+) rename Makfile => Makefile (81%) diff --git a/Makfile b/Makefile similarity index 81% rename from Makfile rename to Makefile index 0e9d2c6..1eb0681 100644 --- a/Makfile +++ b/Makefile @@ -5,5 +5,6 @@ install: test: prove -f + prove -v -f t_todo || true .PHONY: all install test From ead2da0c3963f3229b6b33a09391730dbafb61bf Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 12:29:30 -0500 Subject: [PATCH 30/36] Tests for future enhancements --- t_todo/lines.t | 51 +++++++++++++++++++++++++++++++++++++++++++++++ t_todo/metatags.t | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 t_todo/lines.t create mode 100644 t_todo/metatags.t diff --git a/t_todo/lines.t b/t_todo/lines.t new file mode 100644 index 0000000..9062d2a --- /dev/null +++ b/t_todo/lines.t @@ -0,0 +1,51 @@ +#!perl -T + +use Test::More tests => 2; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'Split long lines'; +func() { + if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then echo; else; echo; fi; else; echo; fi; else; echo; fi +} +EOM +func() { + if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then + if [ $? -eq 0 ]; then echo; else; echo; fi; else; echo; fi + else; echo; fi +} + +EOM + +eq_or_diff a(<<'EOM'), <<'EOM', 'Join short lines'; +func() { + if [ $? -eq 0 ] && + [ $? -eq 0 ] || + [ $? -eq 0 ]; then + echo + else + echo + fi +} +EOM +func() { + if [ $? -eq 0 ] && [ $? -eq 0 ] || [ $? -eq 0 ]; then + echo + else + echo + fi +} + +EOM diff --git a/t_todo/metatags.t b/t_todo/metatags.t new file mode 100644 index 0000000..9fb99df --- /dev/null +++ b/t_todo/metatags.t @@ -0,0 +1,36 @@ +#!perl -T + +use Test::More tests => 1; + +BEGIN { + if (!eval q{ use Test::Differences; 1 }) { + *eq_or_diff = \&is_deeply; + } +} + +delete $ENV{PATH}; + +sub a { +return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +$_[0] +EOM` +} + +eq_or_diff a(<<'EOM'), <<'EOM', 'Formatter off/on'; +# @formatter:off + func() { + echo + +# @formatter:on + echo + } +EOM +# @formatter:off + func() { + echo + +# @formatter:on + echo +} + +EOM From 3b168c3f8dc7711db9eee93d31ad266407ea4337 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 14:07:39 -0500 Subject: [PATCH 31/36] No need to test perl tainted --- t/basic.t | 2 -- t/elfi.t | 2 -- t/heredoc.t | 2 -- t/literals.t | 2 -- t/trim.t | 2 -- t/wrapping.t | 2 -- t_todo/lines.t | 2 -- t_todo/metatags.t | 2 -- 8 files changed, 16 deletions(-) diff --git a/t/basic.t b/t/basic.t index b32791d..a7a0130 100644 --- a/t/basic.t +++ b/t/basic.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 4; BEGIN { diff --git a/t/elfi.t b/t/elfi.t index c29961c..01d2e13 100644 --- a/t/elfi.t +++ b/t/elfi.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 1; BEGIN { diff --git a/t/heredoc.t b/t/heredoc.t index a1789f2..fa4315c 100644 --- a/t/heredoc.t +++ b/t/heredoc.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 4; BEGIN { diff --git a/t/literals.t b/t/literals.t index ccdab15..358c01c 100644 --- a/t/literals.t +++ b/t/literals.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 2; BEGIN { diff --git a/t/trim.t b/t/trim.t index cb3b976..85afece 100644 --- a/t/trim.t +++ b/t/trim.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 1; BEGIN { diff --git a/t/wrapping.t b/t/wrapping.t index 42f07bf..e228117 100644 --- a/t/wrapping.t +++ b/t/wrapping.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 1; BEGIN { diff --git a/t_todo/lines.t b/t_todo/lines.t index 9062d2a..c0642f5 100644 --- a/t_todo/lines.t +++ b/t_todo/lines.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 2; BEGIN { diff --git a/t_todo/metatags.t b/t_todo/metatags.t index 9fb99df..b92c230 100644 --- a/t_todo/metatags.t +++ b/t_todo/metatags.t @@ -1,5 +1,3 @@ -#!perl -T - use Test::More tests => 1; BEGIN { From 1e5b7966a9bb8e6a8a3c318cb97e96541a6c6fd8 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 14:09:10 -0500 Subject: [PATCH 32/36] Cleanup beautify_bash.py exec --- t/basic.t | 2 +- t/elfi.t | 2 +- t/heredoc.t | 2 +- t/literals.t | 2 +- t/trim.t | 2 +- t/wrapping.t | 2 +- t_todo/lines.t | 2 +- t_todo/metatags.t | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/t/basic.t b/t/basic.t index a7a0130..198e189 100644 --- a/t/basic.t +++ b/t/basic.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } diff --git a/t/elfi.t b/t/elfi.t index 01d2e13..2a90581 100644 --- a/t/elfi.t +++ b/t/elfi.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } diff --git a/t/heredoc.t b/t/heredoc.t index fa4315c..692ed8e 100644 --- a/t/heredoc.t +++ b/t/heredoc.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } diff --git a/t/literals.t b/t/literals.t index 358c01c..58d82b7 100644 --- a/t/literals.t +++ b/t/literals.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } diff --git a/t/trim.t b/t/trim.t index 85afece..b703a6b 100644 --- a/t/trim.t +++ b/t/trim.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } diff --git a/t/wrapping.t b/t/wrapping.t index e228117..f811bb6 100644 --- a/t/wrapping.t +++ b/t/wrapping.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } diff --git a/t_todo/lines.t b/t_todo/lines.t index c0642f5..72cd494 100644 --- a/t_todo/lines.t +++ b/t_todo/lines.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } diff --git a/t_todo/metatags.t b/t_todo/metatags.t index b92c230..0c51aee 100644 --- a/t_todo/metatags.t +++ b/t_todo/metatags.t @@ -9,7 +9,7 @@ BEGIN { delete $ENV{PATH}; sub a { -return scalar `/usr/bin/env python ./beautify_bash.py -t3 - <<"EOM" +return scalar `/usr/bin/env python ./beautify_bash.py -t3 <<"EOM" $_[0] EOM` } From e1a3a1b28ae804ebd7db01fed1d81875f6118ae7 Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 14:10:24 -0500 Subject: [PATCH 33/36] Add manpage --- beautify_bash.1 | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 beautify_bash.1 diff --git a/beautify_bash.1 b/beautify_bash.1 new file mode 100644 index 0000000..1e3bfe0 --- /dev/null +++ b/beautify_bash.1 @@ -0,0 +1,36 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" (C) Copyright 2017 Mike Mestnik , +.\" +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH Beautify-bash 1 "July 9 2017" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +beautify-bash \- A beautifier for Bash shell scripts written in Python +.SH SYNOPSIS +.B beautify-bash +.RI " files" ... +.SH DESCRIPTION +This manual page documents briefly the +.B beautify-bash +command. +.PP +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invode bold face and italics, +.\" respectively. +\fBbeautify-bash\fP is a program that indets and stuff Bash shell scripts. +.SH OPTIONS +These programs follow the usual dashe (`-') means use stdin/out. +Files are modified and backups created with tilde (`~') suffix. From d3989d8a73329f141776e0aa0afef7acd06dbaef Mon Sep 17 00:00:00 2001 From: Michael Mestnik Date: Mon, 10 Jul 2017 14:27:19 -0500 Subject: [PATCH 34/36] Add meta files --- AUTHORS | 2 + CHANGES | 6 + LICENSE | 340 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 348 insertions(+) create mode 100644 AUTHORS create mode 100644 CHANGES create mode 100644 LICENSE diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..501a5e1 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Paul Lutus +Shriram V diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..a61f045 --- /dev/null +++ b/CHANGES @@ -0,0 +1,6 @@ +Version 1.1 07/10/2017. Rekindled. + + * pep8 + * testcases and todo items + +Version 1.0 04/14/2011. Initial Public Release. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8cdb845 --- /dev/null +++ b/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + From c6d1d211a4883371f0d53ada8bf0decc2f0b8dc9 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Wed, 12 Jul 2017 05:48:35 -0400 Subject: [PATCH 35/36] Updated travis status page in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d09b1d..057131b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ beautify_bash Code formatter / beautifier for bash written in python by Paul Lutus (a remake of previous version in Ruby). -[![Build Status](https://travis-ci.org/cheako/beautify_bash.svg)](https://travis-ci.org/cheako/beautify_bash) +[![Build Status](https://travis-ci.org/shri314/beautify_bash.svg)](https://travis-ci.org/shri314/beautify_bash) For further details please see the following blog record http://arachnoid.com/python/beautify_bash_program.html From d2133c5c6fcd2b6e2139e4910b9dd678bc082e28 Mon Sep 17 00:00:00 2001 From: Shriram V Date: Sat, 19 Aug 2017 08:19:38 +0530 Subject: [PATCH 36/36] Added basic circleci configuration --- .circleci/config.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..d1b39f2 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,17 @@ +version: 2 + +jobs: + build: + docker: + - image: circleci/python + steps: + - checkout + - run: + name: Build and install + command: 'sudo make install' + - run: + name: Test dependencies + command: 'sudo apt-get update; sudo apt-get install libtest-differences-perl' + - run: + name: Run tests + command: 'make test'