[
  {
    "path": ".github/workflows/semgrep.yml",
    "content": "\non:\n  pull_request: {}\n  workflow_dispatch: {}\n  push: \n    branches:\n      - main\n      - master\nname: Semgrep config\njobs:\n  semgrep:\n    name: semgrep/ci\n    runs-on: ubuntu-20.04\n    env:\n      SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}\n      SEMGREP_URL: https://cloudflare.semgrep.dev\n      SEMGREP_APP_URL: https://cloudflare.semgrep.dev\n      SEMGREP_VERSION_CHECK_URL: https://cloudflare.semgrep.dev/api/check-version\n    container:\n      image: returntocorp/semgrep\n    steps:\n      - uses: actions/checkout@v3\n      - run: semgrep ci\n"
  },
  {
    "path": ".gitignore",
    "content": "*~\n*tmp\n*swp\n\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2013, Ray Bejjani\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met: \n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer. \n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nThe views and conclusions contained in the software and documentation are those\nof the authors and should not be interpreted as representing official policies, \neither expressed or implied, of the FreeBSD Project.\n"
  },
  {
    "path": "README.md",
    "content": "semver_bash is a bash parser for semantic versioning\n====================================================\n\n[Semantic Versioning](http://semver.org/) is a set of guidelines that help keep\nversion and version management sane. This is a bash based parser to help manage\na project's versions. Use it from a Makefile or any scripts you use in your\nproject.\n\nUsage\n-----\nsemver_bash can be used from the command line as:  \n\n    $ ./semver.sh \"3.2.1\" \"3.2.1-alpha\"  \n    3.2.1 -> M: 3 m:2 p:1 s:  \n    3.2.1-alpha -> M: 3 m:2 p:1 s:-alpha  \n    3.2.1 == 3.2.1-alpha -> 1.  \n    3.2.1 < 3.2.1-alpha -> 1.  \n    3.2.1 > 3.2.1-alpha -> 0.\n\n\nAlternatively, you can source it from within a script:\n\n    . ./semver.sh  \n    \n    local MAJOR=0  \n    local MINOR=0  \n    local PATCH=0  \n    local SPECIAL=\"\"\n    \n    semverParseInto \"1.2.3\" MAJOR MINOR PATCH SPECIAL  \n    semverParseInto \"3.2.1\" MAJOR MINOR PATCH SPECIAL  \n"
  },
  {
    "path": "semver.sh",
    "content": "#!/usr/bin/env sh\n\nfunction semverParseInto() {\n    local RE='[^0-9]*\\([0-9]*\\)[.]\\([0-9]*\\)[.]\\([0-9]*\\)\\([0-9A-Za-z-]*\\)'\n    #MAJOR\n    eval $2=`echo $1 | sed -e \"s#$RE#\\1#\"`\n    #MINOR\n    eval $3=`echo $1 | sed -e \"s#$RE#\\2#\"`\n    #MINOR\n    eval $4=`echo $1 | sed -e \"s#$RE#\\3#\"`\n    #SPECIAL\n    eval $5=`echo $1 | sed -e \"s#$RE#\\4#\"`\n}\n\nfunction semverEQ() {\n    local MAJOR_A=0\n    local MINOR_A=0\n    local PATCH_A=0\n    local SPECIAL_A=0\n\n    local MAJOR_B=0\n    local MINOR_B=0\n    local PATCH_B=0\n    local SPECIAL_B=0\n\n    semverParseInto $1 MAJOR_A MINOR_A PATCH_A SPECIAL_A\n    semverParseInto $2 MAJOR_B MINOR_B PATCH_B SPECIAL_B\n\n    if [ $MAJOR_A -ne $MAJOR_B ]; then\n        return 1\n    fi\n\n    if [ $MINOR_A -ne $MINOR_B ]; then\n        return 1\n    fi\n\n    if [ $PATCH_A -ne $PATCH_B ]; then\n        return 1\n    fi\n\n    if [[ \"_$SPECIAL_A\" != \"_$SPECIAL_B\" ]]; then\n        return 1\n    fi\n\n\n    return 0\n\n}\n\nfunction semverLT() {\n    local MAJOR_A=0\n    local MINOR_A=0\n    local PATCH_A=0\n    local SPECIAL_A=0\n\n    local MAJOR_B=0\n    local MINOR_B=0\n    local PATCH_B=0\n    local SPECIAL_B=0\n\n    semverParseInto $1 MAJOR_A MINOR_A PATCH_A SPECIAL_A\n    semverParseInto $2 MAJOR_B MINOR_B PATCH_B SPECIAL_B\n\n    if [ $MAJOR_A -lt $MAJOR_B ]; then\n        return 0\n    fi\n\n    if [[ $MAJOR_A -le $MAJOR_B  && $MINOR_A -lt $MINOR_B ]]; then\n        return 0\n    fi\n    \n    if [[ $MAJOR_A -le $MAJOR_B  && $MINOR_A -le $MINOR_B && $PATCH_A -lt $PATCH_B ]]; then\n        return 0\n    fi\n\n    if [[ \"_$SPECIAL_A\"  == \"_\" ]] && [[ \"_$SPECIAL_B\"  == \"_\" ]] ; then\n        return 1\n    fi\n    if [[ \"_$SPECIAL_A\"  == \"_\" ]] && [[ \"_$SPECIAL_B\"  != \"_\" ]] ; then\n        return 1\n    fi\n    if [[ \"_$SPECIAL_A\"  != \"_\" ]] && [[ \"_$SPECIAL_B\"  == \"_\" ]] ; then\n        return 0\n    fi\n\n    if [[ \"_$SPECIAL_A\" < \"_$SPECIAL_B\" ]]; then\n        return 0\n    fi\n\n    return 1\n\n}\n\nfunction semverGT() {\n    semverEQ $1 $2\n    local EQ=$?\n\n    semverLT $1 $2\n    local LT=$?\n\n    if [ $EQ -ne 0 ] && [ $LT -ne 0 ]; then\n        return 0\n    else\n        return 1\n    fi\n}\n\nif [ \"___semver.sh\" == \"___`basename $0`\" ]; then\n\nMAJOR=0\nMINOR=0\nPATCH=0\nSPECIAL=\"\"\n\nsemverParseInto $1 MAJOR MINOR PATCH SPECIAL\necho \"$1 -> M: $MAJOR m:$MINOR p:$PATCH s:$SPECIAL\"\n\nsemverParseInto $2 MAJOR MINOR PATCH SPECIAL\necho \"$2 -> M: $MAJOR m:$MINOR p:$PATCH s:$SPECIAL\"\n\nsemverEQ $1 $2\necho \"$1 == $2 -> $?.\"\n\nsemverLT $1 $2\necho \"$1 < $2 -> $?.\"\n\nsemverGT $1 $2\necho \"$1 > $2 -> $?.\"\n\nfi\n"
  },
  {
    "path": "semver_test.sh",
    "content": "#!/usr/bin/env bash\n\n. ./semver.sh\n\nsemverTest() {\nlocal A=R1.3.2\nlocal B=R2.3.2\nlocal C=R1.4.2\nlocal D=R1.3.3\nlocal E=R1.3.2a\nlocal F=R1.3.2b\nlocal G=R1.2.3\n\nlocal MAJOR=0\nlocal MINOR=0\nlocal PATCH=0\nlocal SPECIAL=\"\"\n\nsemverParseInto $A MAJOR MINOR PATCH SPECIAL\necho \"$A -> M:$MAJOR m:$MINOR p:$PATCH s:$SPECIAL. Expect M:1 m:3 p:2 s:\"\nsemverParseInto $E MAJOR MINOR PATCH SPECIAL\necho \"$E -> M:$MAJOR m:$MINOR p:$PATCH s:$SPECIAL. Expect M:1 m:3 p:2 s:a\"\n\necho \"Equality comparisions\"\nsemverEQ $A $A\necho \"$A == $A -> $?. Expect 0.\"\n\nsemverLT $A $A\necho \"$A < $A -> $?. Expect 1.\"\n\nsemverGT $A $A\necho \"$A > $A -> $?. Expect 1.\"\n\n\necho \"Major number comparisions\"\nsemverEQ $A $B\necho \"$A == $B -> $?. Expect 1.\"\n\nsemverLT $A $B\necho \"$A < $B -> $?. Expect 0.\"\n\nsemverGT $A $B\necho \"$A > $B -> $?. Expect 1.\"\n\nsemverEQ $B $A\necho \"$B == $A -> $?. Expect 1.\"\n\nsemverLT $B $A\necho \"$B < $A -> $?. Expect 1.\"\n\nsemverGT $B $A\necho \"$B > $A -> $?. Expect 0.\"\n\n\necho \"Minor number comparisions\"\nsemverEQ $A $C\necho \"$A == $C -> $?. Expect 1.\"\n\nsemverLT $A $C\necho \"$A < $C -> $?. Expect 0.\"\n\nsemverGT $A $C\necho \"$A > $C -> $?. Expect 1.\"\n\nsemverEQ $C $A\necho \"$C == $A -> $?. Expect 1.\"\n\nsemverLT $C $A\necho \"$C < $A -> $?. Expect 1.\"\n\nsemverGT $C $A\necho \"$C > $A -> $?. Expect 0.\"\n\necho \"patch number comparisions\"\nsemverEQ $A $D\necho \"$A == $D -> $?. Expect 1.\"\n\nsemverLT $A $D\necho \"$A < $D -> $?. Expect 0.\"\n\nsemverGT $A $D\necho \"$A > $D -> $?. Expect 1.\"\n\nsemverEQ $D $A\necho \"$D == $A -> $?. Expect 1.\"\n\nsemverLT $D $A\necho \"$D < $A -> $?. Expect 1.\"\n\nsemverGT $D $A\necho \"$D > $A -> $?. Expect 0.\"\n\necho \"special section vs no special comparisions\"\nsemverEQ $A $E\necho \"$A == $E -> $?. Expect 1.\"\n\nsemverLT $A $E\necho \"$A < $E -> $?. Expect 1.\"\n\nsemverGT $A $E\necho \"$A > $E -> $?. Expect 0.\"\n\nsemverEQ $E $A\necho \"$E == $A -> $?. Expect 1.\"\n\nsemverLT $E $A\necho \"$E < $A -> $?. Expect 0.\"\n\nsemverGT $E $A\necho \"$E > $A -> $?. Expect 1.\"\n\necho \"special section vs special comparisions\"\nsemverEQ $E $F\necho \"$E == $F -> $?. Expect 1.\"\n\nsemverLT $E $F\necho \"$E < $F -> $?. Expect 0.\"\n\nsemverGT $E $F\necho \"$E > $F -> $?. Expect 1.\"\n\nsemverEQ $F $E\necho \"$F == $E -> $?. Expect 1.\"\n\nsemverLT $F $E\necho \"$F < $E -> $?. Expect 1.\"\n\nsemverGT $F $E\necho \"$F > $E -> $?. Expect 0.\"\n\necho \"Minor and patch number comparisons\"\nsemverEQ $A $G\necho \"$A == $G -> $?. Expect 1.\"\n\nsemverLT $A $G\necho \"$A < $G -> $?. Expect 1.\"\n\nsemverGT $A $G\necho \"$A > $G -> $?. Expect 0.\"\n\nsemverEQ $G $A\necho \"$G == $A -> $?. Expect 1.\"\n\nsemverLT $G $A\necho \"$G < $A -> $?. Expect 0.\"\n\nsemverGT $G $A\necho \"$G > $A -> $?. Expect 1.\"\n}\n\nsemverTest\n"
  }
]