Adds the missing 'assert_file_not_contains' function

Closes https://github.com/bats-core/bats-file/issues/60
diff --git a/src/file.bash b/src/file.bash
index 355c580..28192b5 100644
--- a/src/file.bash
+++ b/src/file.bash
@@ -548,6 +548,31 @@
       | fail
   fi
 }
+# Fail and display path of the file (or directory) if it does contain a string.
+# This function is the logical complement of `assert_file_contains'.
+#
+# Globals:
+#   BATSLIB_FILE_PATH_REM
+#   BATSLIB_FILE_PATH_ADD
+# Arguments:
+#   $1 - path
+#   $2 - regex
+# Returns:
+#   0 - file does not contain regex
+#   1 - otherwise
+# Outputs:
+#   STDERR - details, on failure
+assert_file_not_contains() {
+  local -r file="$1"
+  local -r regex="$2"
+  if grep -q "$regex" "$file"; then
+    local -r rem="${BATSLIB_FILE_PATH_REM-}"
+    local -r add="${BATSLIB_FILE_PATH_ADD-}"
+    batslib_print_kv_single 4 'path' "${file/$rem/$add}" 'regex' "$regex" \
+      | batslib_decorate 'file contains regex' \
+      | fail
+  fi
+}
 # Fail and display path of the file (or directory) if it is not empty.
 # This function is the logical complement of `assert_file_not_empty'.
 #
diff --git a/test/67-assert-10-assert_file_not_contains.bats b/test/67-assert-10-assert_file_not_contains.bats
new file mode 100644
index 0000000..f495a7f
--- /dev/null
+++ b/test/67-assert-10-assert_file_not_contains.bats
@@ -0,0 +1,43 @@
+#!/usr/bin/env bats
+load 'test_helper'
+fixtures 'empty'
+# Correctness
+@test 'assert_file_not_contains() <file>: returns 0 and displays content if <file> does not match string' {
+  local -r file="${TEST_FIXTURE_ROOT}/dir/non-empty-file"
+  run assert_file_not_contains "$file" "XXX"
+  [ "$status" -eq 0 ]
+}
+@test 'assert_file_not_contains() <file>: returns 1 and displays content if <file> does match string' {
+  local -r file="${TEST_FIXTURE_ROOT}/dir/non-empty-file"
+  run assert_file_not_contains "$file" "Not empty"
+  [ "$status" -eq 1 ]
+}
+# Transforming path
+@test 'assert_file_not_contains() <file>: replace prefix of displayed path' {
+  local -r BATSLIB_FILE_PATH_REM="#${TEST_FIXTURE_ROOT}"
+  local -r BATSLIB_FILE_PATH_ADD='..'
+  run assert_file_not_contains "${TEST_FIXTURE_ROOT}/dir/non-empty-file" "Not empty"
+  [ "$status" -eq 1 ]
+}
+@test 'assert_file_not_contains() <file>: replace suffix of displayed path' {
+  local -r BATSLIB_FILE_PATH_REM='%non-empty-file'
+  local -r BATSLIB_FILE_PATH_ADD='..'
+  run assert_file_not_contains "${TEST_FIXTURE_ROOT}/dir/non-empty-file" "Not empty"
+  [ "$status" -eq 1 ]
+}
+@test 'assert_file_not_contains() <file>: replace infix of displayed path' {
+  local -r BATSLIB_FILE_PATH_REM='dir'
+  local -r BATSLIB_FILE_PATH_ADD='..'
+  run assert_file_not_contains "${TEST_FIXTURE_ROOT}/dir/non-empty-file" "Not empty"
+  [ "$status" -eq 1 ]
+}
+@test 'assert_file_not_contains() <file>: show missing regex in case of failure' {
+  local -r file="${TEST_FIXTURE_ROOT}/dir/non-empty-file"
+  run assert_file_not_contains "$file" "Not empty"
+  [ "$status" -eq 1 ]
+  [ "${#lines[@]}" -eq 4 ]
+  [ "${lines[0]}" == '-- file does not contain regex --' ]
+  [ "${lines[1]}" == "path : $file" ]
+  [ "${lines[2]}" == "regex : Not empty" ]
+  [ "${lines[3]}" == '--' ]
+}