Commit edb06ab2 authored by 徐豪's avatar 徐豪
Browse files

init

parents

Too many changes to show.

To preserve performance only 532 of 532+ files are displayed.
RUBY_UPGRADE_MESSAGE = <<~MSG.freeze
This merge request is updating the Ruby version.
Please make sure this merge request follows all standards established
within the [Ruby upgrade guidelines](https://docs.gitlab.com/ee/development/ruby_upgrade.html).
MSG
lines = helper.changed_lines("config/software/ruby.rb")
warn format(RUBY_UPGRADE_MESSAGE) if lines.any? { |line| line =~ /[+-]+.*default_version/ }
NO_BUILD_CHANGE_HAPPENED_LABELS = [
'maintenance::pipelines',
'maintenance::workflow'
].freeze
SOFTWARE_MESSAGE = <<~MSG.freeze
You've made some changes to the software definitions.
Any change in software definition requires:
- package rebuild to verify that builds across the supported platforms are successful.
- manual verification to confirm the package is installable
- [uses an approved license](https://about.gitlab.com/handbook/engineering/open-source/#acceptable-licenses)
If the change does not affect existing functionality, for example when
resolving `rubocop` warnings, adding comments, or fixing typos, add one of
the following labels:
- %<labels>s
MSG
LIBRARY_FILES = [
'config/patches/',
'config/projects/',
'config/software/',
'config/templates/'
].freeze
def no_build_change_happened_labels
NO_BUILD_CHANGE_HAPPENED_LABELS.map { |label| %(~"#{label}") }.join("\n- ")
end
def library_paths_requiring_review(files)
to_review = []
files.each do |file|
review = LIBRARY_FILES.any? do |pattern|
file.start_with?(pattern)
end
to_review << file if review
end
to_review
end
has_config_changes = !library_paths_requiring_review(helper.all_changed_files).empty?
requires_build_review = (helper.mr_labels & NO_BUILD_CHANGE_HAPPENED_LABELS).empty?
warn format(SOFTWARE_MESSAGE, labels: no_build_change_happened_labels) if has_config_changes && requires_build_review
NO_NEW_SPEC_MESSAGE = <<~MSG.freeze
You've made some changes in the cookbooks, but didn't add any tests.
That's OK as long as you're refactoring existing code,
but please consider adding the ~"type::maintenance" label in that case.
MSG
all_changed_files = helper.all_changed_files
has_app_changes = all_changed_files.grep(%r{\A(files|lib)/}).any?
has_spec_changes = all_changed_files.grep(/spec/).any?
warn NO_NEW_SPEC_MESSAGE, sticky: false if has_app_changes && !has_spec_changes
# frozen_string_literal: true
# All the files/directories that could contain a user facing configuration change.
ATTRIBUTE_FILES = [
'files/gitlab-cookbooks/consul/attributes/default.rb',
'files/gitlab-cookbooks/consul/attributes/services.rb',
'files/gitlab-cookbooks/consul/attributes/watchers.rb',
'files/gitlab-cookbooks/consul/libraries/',
'files/gitlab-cookbooks/crond/attributes/default.rb',
'files/gitlab-cookbooks/gitaly/attributes/default.rb',
'files/gitlab-cookbooks/gitaly/libraries/',
'files/gitlab-cookbooks/gitlab/attributes/default.rb',
'files/gitlab-cookbooks/gitlab/libraries/',
'files/gitlab-cookbooks/gitlab-ee/attributes/default.rb',
'files/gitlab-cookbooks/gitlab-ee/libraries/',
'files/gitlab-cookbooks/letsencrypt/attributes/default.rb',
'files/gitlab-cookbooks/letsencrypt/libraries/',
'files/gitlab-cookbooks/mattermost/attributes/default.rb',
'files/gitlab-cookbooks/mattermost/libraries/',
'files/gitlab-cookbooks/package/attributes/default.rb',
'files/gitlab-cookbooks/package/libraries/',
'files/gitlab-cookbooks/registry/attributes/default.rb',
'files/gitlab-cookbooks/runit/attributes/external.rb'
].freeze
def user_configuration_paths_requiring_review(files)
to_review = []
files.each do |file|
review = ATTRIBUTE_FILES.any? do |pattern|
file.start_with?(pattern)
end
to_review << file if review
end
to_review
end
configuration_paths_to_review = user_configuration_paths_requiring_review(helper.all_changed_files)
NO_TEMPLATE_CHANGE_MESSAGE = <<~MSG
You've made some changes at the locations which contain user facing configuration.
That's OK as long as you're refactoring existing code and not adding any new
configuration. If you are adding new user facing configuration, consider adding
to gitlab.rb.template located in files/gitlab-config-template/gitlab.rb.template .
Otherwise, please consider adding the ~"type::maintenance" label in that case.
MSG
warn NO_TEMPLATE_CHANGE_MESSAGE, sticky: false if !helper.changes.modified.files.include?('files/gitlab-config-template/gitlab.rb.template') && !configuration_paths_to_review.empty?
version: 3
dependencies:
- type: git
manifest_updates:
filters:
- name: ".*acme.*" # acme-client/chef-acme
group: true
enabled: true
- name: ".*chef/.*" # Chef libs
group: true
enabled: true
- name: .* # everything else
enabled: true
settings:
gitlab_labels:
- group::distribution
- section::core platform
- devops::systems
- type::maintenance
- maintenance::dependency
- dependencies.io
- workflow::ready for review
gitlab_remove_source_branch: true
commit_message_template: |-
{{.SubjectAndBody}}
Changelog: changed
remotes:
# acme-client
https://github.com/unixcharles/acme-client.git:
replace_in_files:
- filename: config/templates/omnibus-gitlab-gems/Gemfile
pattern: "gem 'acme-client', '(\\S+)'"
tag_prefix: 'v'
# chef-acme
https://github.com/schubergphilis/chef-acme.git:
replace_in_files:
- filename: config/software/chef-acme.rb
pattern: "version = Gitlab::Version.new\\(name, 'v(\\S+)'\\)"
tag_prefix: 'v'
# alertmanager
https://gitlab.com/gitlab-org/build/omnibus-mirror/alertmanager.git:
replace_in_files:
- filename: config/software/alertmanager.rb
pattern: "Gitlab::Version.new\\('alertmanager', '(\\S+)'\\)"
tag_prefix: 'v'
# chef
https://github.com/chef/chef.git:
replace_in_files:
- filename: config/templates/omnibus-gitlab-gems/Gemfile
pattern: "gem 'chef', '(\\S+)'"
tag_prefix: 'v'
range: '<= 18.x'
- filename: config/templates/omnibus-gitlab-gems/Gemfile
pattern: "gem 'chef-bin', '(\\S+)'"
tag_prefix: 'v'
range: '<= 18.x'
# ohai
https://github.com/chef/ohai.git:
replace_in_files:
- filename: config/templates/omnibus-gitlab-gems/Gemfile
pattern: "gem 'ohai', '(\\S+)'"
tag_prefix: 'v'
range: '<= 18.x'
# mixlib-log
https://github.com/chef/mixlib-log.git:
replace_in_files:
- filename: config/templates/omnibus-gitlab-gems/Gemfile
pattern: "gem 'mixlib-log', '(\\S+)'"
# chef-zero
https://github.com/chef/chef-zero:
replace_in_files:
- filename: config/templates/omnibus-gitlab-gems/Gemfile
pattern: "gem 'chef-zero', '(\\S+)'"
# compat_resource
https://github.com/chef-cookbooks/compat_resource.git:
replace_in_files:
- filename: config/software/compat_resource.rb
pattern: "version = Gitlab::Version.new\\('compat_resource', 'v(\\S+)'\\)"
# consul
https://github.com/hashicorp/consul.git:
replace_in_files:
- filename: config/software/consul.rb
pattern: "version = Gitlab::Version.new\\('consul', 'v(\\S+)'\\)"
range: '< 1.19.0'
- filename: files/gitlab-ctl-commands-ee/lib/consul_download.rb
pattern: "DEFAULT_VERSION = '(\\S+)'"
range: '< 1.19.0'
- filename: files/gitlab-cookbooks/consul/libraries/consul_helper.rb
pattern: "SUPPORTED_MINOR = '(\\S+)'"
tag_filter:
output_as: '$1.$2'
# go-crond
https://github.com/webdevops/go-crond.git:
replace_in_files:
- filename: config/software/go-crond.rb
pattern: "version = Gitlab::Version.new\\('go-crond', '(\\S+)'\\)"
# jemalloc
https://github.com/jemalloc/jemalloc.git:
replace_in_files:
- filename: config/software/jemalloc.rb
pattern: "version = Gitlab::Version.new\\('jemalloc', '(\\S+)'\\)"
# libpng
https://git.code.sf.net/p/libpng/code.git:
replace_in_files:
- filename: config/software/libpng.rb
pattern: "version = Gitlab::Version.new\\('libpng', 'v(\\S+)'\\)"
tag_prefix: 'v'
# logrotate
https://gitlab.com/gitlab-org/build/omnibus-mirror/logrotate.git:
replace_in_files:
- filename: config/software/logrotate.rb
pattern: "Gitlab::Version.new\\(name, '(\\S+)'\\)"
# nginx-module-vts
https://gitlab.com/gitlab-org/build/omnibus-mirror/nginx-module-vts.git:
replace_in_files:
- filename: config/software/nginx-module-vts.rb
pattern: "Gitlab::Version.new\\('nginx-module-vts', '(\\S+)'\\)"
# nginx
https://github.com/nginx/nginx.git:
replace_in_files:
- filename: config/software/nginx.rb
pattern: "Gitlab::Version.new\\('nginx', 'release-(\\S+)'\\)"
tag_prefix: 'release-'
# openssl
https://github.com/openssl/openssl.git:
replace_in_files:
- filename: config/software/openssl_1.rb
pattern: "Gitlab::Version.new\\('openssl', 'OpenSSL_1_1_(\\S+)'\\)"
tag_prefix: 'OpenSSL_1_1_'
semver: false
# remote-syslog
https://github.com/papertrail/remote_syslog.git:
replace_in_files:
- filename: config/templates/omnibus-gitlab-gems/Gemfile
pattern: "gem 'remote_syslog', '(\\S+)'"
# rubygems
https://github.com/rubygems/rubygems.git:
replace_in_files:
- filename: config/software/rubygems.rb
pattern: "default_version '(\\S+)'"
range: '<= 3.x'
# zlib
https://github.com/madler/zlib.git:
replace_in_files:
- filename: config/software/zlib.rb
pattern: "Gitlab::Version.new\\('zlib', 'v(\\S+)'\\)"
tag_prefix: 'v'
# prometheus
https://gitlab.com/gitlab-org/build/omnibus-mirror/prometheus.git:
replace_in_files:
- filename: config/software/prometheus.rb
pattern: "Gitlab::Version.new\\('prometheus', '(\\S+)'\\)"
tag_prefix: 'v'
# gitlab-exporter
https://gitlab.com/gitlab-org/gitlab-exporter.git:
replace_in_files:
- filename: config/software/gitlab-exporter.rb
pattern: "default_version '(\\S+)'"
# node-exporter
https://gitlab.com/gitlab-org/build/omnibus-mirror/node_exporter.git:
replace_in_files:
- filename: config/software/node-exporter.rb
pattern: "Gitlab::Version.new\\('node-exporter', '(\\S+)'\\)"
tag_prefix: 'v'
# postgres-exporter
https://gitlab.com/gitlab-org/build/omnibus-mirror/postgres_exporter.git:
replace_in_files:
- filename: config/software/postgres-exporter.rb
pattern: "Gitlab::Version.new\\('postgres-exporter', '(\\S+)'\\)"
tag_prefix: 'v'
# pgbouncer-exporter
https://gitlab.com/gitlab-org/build/omnibus-mirror/pgbouncer_exporter.git:
replace_in_files:
- filename: config/software/pgbouncer-exporter.rb
pattern: "Gitlab::Version.new\\('pgbouncer-exporter', '(\\S+)'\\)"
tag_prefix: 'v'
# redis-exporter
https://gitlab.com/gitlab-org/build/omnibus-mirror/redis_exporter.git:
replace_in_files:
- filename: config/software/redis-exporter.rb
pattern: "Gitlab::Version.new\\('redis-exporter', '(\\S+)'\\)"
tag_prefix: 'v'
#libjpeg-turbo
https://github.com/libjpeg-turbo/libjpeg-turbo.git:
replace_in_files:
- filename: config/software/libjpeg-turbo.rb
pattern: "Gitlab::Version.new\\('libjpeg-turbo', '(\\S+)'\\)"
range: '< 2.1.90'
#libtiff
https://gitlab.com/libtiff/libtiff.git:
replace_in_files:
- filename: config/software/libtiff.rb
pattern: "Gitlab::Version.new\\('libtiff', 'v(\\S+)'\\)"
tag_prefix: 'v'
# pgbouncer
https://github.com/pgbouncer/pgbouncer.git:
replace_in_files:
- filename: config/software/pgbouncer.rb
pattern: "Gitlab::Version.new\\('pgbouncer', '(\\S+)'\\)"
tag_filter:
matching: 'pgbouncer_(\d+)_(\d+)_(\d+)'
sort_as: '$1.$2.$3'
# redis
https://github.com/redis/redis.git:
replace_in_files:
- filename: config/software/redis.rb
pattern: "Gitlab::Version.new\\('redis', '(\\S+)'\\)"
range: '< 7.2.0'
# exiftool
https://github.com/exiftool/exiftool.git:
replace_in_files:
- filename: config/software/exiftool.rb
pattern: "Gitlab::Version.new\\('exiftool', '(\\S+)'\\)"
tag_filter:
matching: '(\d+).(\d+)'
sort_as: '$1.$2.0'
# curl
https://github.com/curl/curl.git:
replace_in_files:
- filename: config/software/curl.rb
pattern: "version = Gitlab::Version.new\\('curl', '(\\S+)'\\)"
tag_filter:
matching: 'curl-(\d+)_(\d+)_(\d+)'
sort_as: '$1.$2.$3'
# pcre2
https://github.com/PCRE2Project/pcre2.git:
replace_in_files:
- filename: config/software/pcre2.rb
pattern: "Gitlab::Version.new\\('pcre2', '(\\S+)'\\)"
tag_filter:
matching: 'pcre2-(\d+).(\d+)$'
sort_as: '$1.$2.0'
# git-filter-repo
https://github.com/newren/git-filter-repo.git:
replace_in_files:
- filename: config/software/git-filter-repo.rb
pattern: "Gitlab::Version.new\\('git-filter-repo', 'v(\\S+)'\\)"
tag_prefix: 'v'
# deps that need updated filtering to work https://github.com/dropseed/deps-git/issues/2
# krb5
# https://github.com/krb5/krb5.git:
# replace_in_files:
# - filename: config/software/krb5.rb
# pattern: "Gitlab::Version.new\\('krb5', 'krb5-(\\S+)'\\)"
# tag_prefix: 'krb5-'
# libevent
# https://github.com/libevent/libevent.git:
# replace_in_files:
# - filename: config/software/libevent.rb
# pattern: "version = Gitlab::Version.new\\('libevent', '(release-\\d+\\.\\d+\\.\\d+-stable)'\\)"
# semver: false
# libicu
# https://github.com/unicode-org/icu.git:
# replace_in_files:
# - filename: config/software/libicu.rb
# pattern: "version = Gitlab::Version.new\\('libicu', 'release-(\\d+-\\d+)'\\)"
# tag_prefix: 'release-'
# semver: false
---
# Extended Markdown configuration to enforce no-trailing-spaces rule
# To use this configuration, in the doc directory, run:
#
# markdownlint-cli2 --config .markdownlint/.markdownlint-cli2.yaml '**/*.md'
config:
default: false
no-trailing-spaces: true
fix: true
---
# Error: gitlab.AlertBoxStyle
#
# Makes sure alert boxes are used with block quotes. Checks for 3 formatting issues:
#
# - Alert boxes inside a block quote ('>')
# - Alert boxes with the note text on the same line
# - Alert boxes using words other than 'NOTE' or 'WARNING'
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Update the format of the '%s' alert box. View the style guide for details."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#alert-boxes
level: error
nonword: true
scope: raw
raw:
- '(\n *\> *(?:NOTE|WARNING)|'
- '\n\n(NOTE|WARNING):[^\n]|'
- '\n\n *(?:> )?\**(Note|note|TIP|Tip|tip|CAUTION|Caution|caution|DANGER|Danger|danger|Warning|warning):.*)'
---
# Warning: gitlab.BadPlurals
#
# Don't write plural words with the '(s)' construction. 'HTTP(S)' is acceptable.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Rewrite '%s' to be plural without parentheses."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html#s
level: warning
ignorecase: true
raw:
- '\b\w+\(s\)(?<!http\(s\))'
# Warning: gitlab.Badges-Offerings
#
# Tests the offering information in the tier badges that appear below topic titles.
#
# For a list of all options, see https://docs.gitlab.com/ee/development/documentation/styleguide/#available-product-tier-badges
extends: existence
message: "Offerings should be comma-separated, without `and`, and must be capitalized. Example: `GitLab.com, Self-managed, GitLab Dedicated`."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/#available-product-tier-badges
level: error
scope: raw
raw:
- (?<=\n\*\*Offering:\*\* )(Dedicated|[^\n]*(SaaS|self-managed|Self-Managed|GitLab dedicated|and|GitLab Dedicated,|, GitLab\.com|, Dedicated))
# Warning: gitlab.Badges-Tiers
#
# Tests the tier information in the tier badges that appear below topic titles.
#
# For a list of all options, see https://docs.gitlab.com/ee/development/documentation/styleguide/#available-product-tier-badges
extends: existence
message: "Tiers should be capitalized, comma-separated, and ordered lowest to highest."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/#available-product-tier-badges
level: error
scope: raw
raw:
- (?<=\n\*\*Tier:\*\*)[^\n]*(free|premium|ultimate|, Free|Ultimate,)
---
# Error: gitlab.British
#
# Checks that US spelling is used instead of British spelling.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: substitution
message: "Use the US spelling '%s' instead of the British '%s'."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#language
level: error
ignorecase: true
swap:
aeon: eon
aeroplane: airplane
ageing: aging
aluminium: aluminum
anaemia: anemia
anaesthesia: anesthesia
analyse: analyze
annexe: annex
apologise: apologize
authorise: authorize
authorised: authorized
authorisation: authorization
authorising: authorizing
behaviour: behavior
busses: buses
calibre: caliber
categorise: categorize
categorised: categorized
categorises: categorizes
categorising: categorizing
centre: center
cheque: check
civilisation: civilization
civilise: civilize
colour: color
cosy: cozy
cypher: cipher
dependant: dependent
defence: defense
distil: distill
draught: draft
encyclopaedia: encyclopedia
enquiry: inquiry
enrol: enroll
enrolment: enrollment
enthral: enthrall
# equalled: equaled // Under discussion
# equalling: equaling // Under discussion
favourite: favorite
fibre: fiber
fillet: filet
flavour: flavor
furore: furor
fulfil: fulfill
gaol: jail
grey: gray
humour: humor
honour: honor
initialled: initialed
initialling: initialing
instil: instill
jewellery: jewelry
labelling: labeling
labelled: labeled
labour: labor
libellous: libelous
licence: license
likeable: likable
liveable: livable
lustre: luster
manoeuvre: maneuver
marvellous: marvelous
matt: matte
meagre: meager
metre: meter
modelling: modeling
moustache: mustache
neighbour: neighbor
normalise: normalize
offence: offense
optimise: optimize
optimised: optimized
optimising: optimizing
organise: organize
orientated: oriented
paralyse: paralyze
plough: plow
pretence: pretense
programme: program
pyjamas: pajamas
rateable: ratable
realise: realize
recognise: recognize
reconnoitre: reconnoiter
rumour: rumor
sabre: saber
saleable: salable
saltpetre: saltpeter
sceptic: skeptic
sepulchre: sepulcher
signalling: signaling
sizeable: sizable
skilful: skillful
sombre: somber
smoulder: smolder
speciality: specialty
spectre: specter
splendour: splendor
standardise: standardize
standardised: standardized
sulphur: sulfur
theatre: theater
travelled: traveled
traveller: traveler
travelling: traveling
unshakeable: unshakable
wilful: willful
yoghurt: yogurt
---
# Error: gitlab.CIConfigFile
#
# Checks that the `.gitlab-ci.yml` file is referenced properly.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Change the file name to be exactly '.gitlab-ci.yml'."
link: https://docs.gitlab.com/ee/development/documentation/versions.html
level: error
scope: raw
raw:
- '(?!`\.gitlab-ci\.yml`)`.?gitlab.?ci.?ya?ml`'
---
# Error: gitlab.CodeblockFences
#
# Ensures all codeblock language tags use the full name, not aliases.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Instead of '%s' for the code block, use yaml, ruby, plaintext, markdown, javascript, shell, go, python, dockerfile, or typescript."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#code-blocks
level: error
scope: raw
raw:
- '\`\`\`(yml|rb|text|md|bash|sh\n|js\n|golang\n|py\n|docker\n|ts)'
---
# Error: gitlab.CommandStringsQuoted
#
# Ensures all code blocks wrap URL strings in quotation marks.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "For the command example, use double quotes around the URL: %s"
link: https://docs.gitlab.com/ee/development/documentation/restful_api_styleguide.html#curl-commands
level: error
scope: raw
nonword: true
tokens:
- '(curl|--url)[^"\]\n]+?https?:\/\/[^ \n]*'
---
# Warning: gitlab.CurrentStatus
#
# Checks for words that indicate a product or feature may change in the future.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Remove '%s'. The documentation reflects the current state of the product."
level: warning
ignorecase: true
link: https://docs.gitlab.com/ee/development/documentation/versions.html#promising-features-in-future-versions
tokens:
- currently
---
# Warning: gitlab.DefaultBranch
#
# Do not refer to the default branch as the 'master' branch, if possible.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Use 'default branch' or `main` instead of `master`, when possible."
level: warning
ignorecase: true
link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html#default-branch
scope: raw
raw:
- '\`master\`'
---
# Suggestion: gitlab.Dropdown
#
# Catches many ways the phrase 'dropdown list' can be fumbled.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Use 'dropdown list'."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html#dropdown-list
level: warning
ignorecase: true
tokens:
- drop-down( [\w]*)?
- dropdown(?! list)
---
# Warning: gitlab.EOLWhitespace
#
# Checks that there is no useless whitespace at the end of lines.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Remove whitespace characters from the end of the line."
link: https://docs.gitlab.com/ee/development/documentation/versions.html
level: warning
scope: raw
raw:
- ' +\n'
---
# Warning: gitlab.ElementDescriptors
#
# Suggests the correct way to describe a button.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "If possible, rewrite to remove 'button'."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html#button
level: warning
ignorecase: true
scope: raw
raw:
- \*\*[^*]+\*\*\s+button
---
# Warning: gitlab.FutureTense
#
# Checks for use of future tense in sentences. Present tense is strongly preferred.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
message: "Instead of future tense '%s', use present tense."
ignorecase: true
level: warning
link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html#future-tense
raw:
- "(going to( |\n|[[:punct:]])[a-zA-Z]*|"
- "will( |\n|[[:punct:]])[a-zA-Z]*|"
- "won't( |\n|[[:punct:]])[a-zA-Z]*|"
- "[a-zA-Z]*'ll( |\n|[[:punct:]])[a-zA-Z]*)"
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment