semantic-rs 1.0.0

Automatic crate publishing
#!/usr/bin/env bats

setup() {
  cd $WORKSPACE
  unset CI
  unset TRAVIS_PULL_REQUEST
  unset TRAVIS_BRANCH
  unset TRAVIS_BUILD_ID
  unset TRAVIS_JOB_NUMBER
}

setup_dirs() {
  if [ -f "_Cargo.toml" ]; then
    mv _Cargo.toml Cargo.toml
  fi

  if [ -d "_git" ]; then
    mv _git .git && git reset --hard master
  fi
}

@test "it runs" {
  run semantic-rs
  [ "$status" -eq 1 ]
}

@test "fails without Cargo.toml" {
  cd empty-dir
  run semantic-rs
  [ "$status" -eq 1 ]
}

@test "fails on non-git directories" {
  cd not-a-repo
  setup_dirs

  run semantic-rs
  [ "$status" -eq 1 ]
}

@test "fails with broken Cargo.toml" {
  cd broken-cargo-toml
  setup_dirs

  run semantic-rs
  [ "$status" -eq 1 ]
}

@test "Initializes to v1.0.0" {
  cd initial-release
  setup_dirs

  semantic-rs --write=yes --release=no
  grep -q 'version = "1.0.0"' Cargo.toml
}

@test "Bumps to next minor" {
  cd next-minor
  setup_dirs

  grep -q 'version = "1.0.0"' Cargo.toml

  semantic-rs --write=yes --release=no

  grep -q 'version = "1.1.0"' Cargo.toml

  run git log --oneline --format=format:%s
  [ "${lines[0]}" = "Bump version to 1.1.0" ]
}

@test "No bump when no new commits" {
  cd no-bump
  setup_dirs

  grep -q 'version = "1.1.0"' Cargo.toml

  run semantic-rs --write=yes --release=no
  [ "$status" -eq 0 ]
  [[ "$output" =~ "No version bump. Nothing to do" ]]

  grep -q 'version = "1.1.0"' Cargo.toml
}

@test "No crash with malformed tags" {
  cd malformed-tag
  setup_dirs

  semantic-rs
}

@test "It creates a new tag with message" {
  cd new-tag
  setup_dirs

  run git tag -l
  [ "$output" = "v1.0.0" ]

  semantic-rs --write=yes --release=no

  run git tag -l
  [ "${lines[0]}" = "v1.0.0" ]
  [ "${lines[1]}" = "v1.1.0" ]
}

@test "Runs a dry-run by default" {
  cd dry-run
  setup_dirs

  semantic-rs
  grep -q 'version = "0.1.0"' Cargo.toml
}

@test "Runs in write-mode with CI=true" {
  cd write-mode
  setup_dirs

  CI=true semantic-rs --release=no
  grep -q 'version = "1.0.0"' Cargo.toml
}

@test "Runs in dry-run-mode with CI=true but dry-run forced" {
  cd write-mode-disabled
  setup_dirs

  CI=true semantic-rs --write=no
  grep -q 'version = "0.1.0"' Cargo.toml
}

@test "Respects Git environment variables" {
  cd env-vars
  setup_dirs

  export GIT_COMMITTER_NAME=semantic-rs
  export GIT_COMMITTER_EMAIL=semantic@rs

  semantic-rs --write=yes --release=no

  run git log --oneline --format=format:'%an %ae'
  [ "${lines[0]}" = "semantic-rs semantic@rs" ]

  unset GIT_AUTHOR_NAME
  unset GIT_COMMITTER_EMAIL
}

@test "Does not run when on wrong branch" {
  cd wrong-branch
  setup_dirs

  run semantic-rs --branch=hamster --release=no
  [[ "$output" =~ "Current branch is 'master', releases are only done from branch 'hamster'" ]]
}

@test "Does not fail when project has no remote" {
  cd has-no-remote
  setup_dirs

  CARGO_TOKEN=1234 run semantic-rs --write=yes

  [ "$status" -eq 0 ]
  [[ "$output" =~ "semantic-rs can't push changes or create a release on GitHub" ]]
}