mirror of
https://github.com/ru-de/faq.git
synced 2024-11-23 19:02:19 +00:00
inline comments
This commit is contained in:
parent
366d7007ab
commit
9d53db7138
@ -14,8 +14,8 @@ install:
|
|||||||
- sudo env PATH=$PATH GOPATH=$GOPATH bash files/check-install.sh
|
- sudo env PATH=$PATH GOPATH=$GOPATH bash files/check-install.sh
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- bash files/check.sh
|
|
||||||
- bash files/run_on_master.sh
|
- bash files/run_on_master.sh
|
||||||
|
- bash files/check.sh
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
email: false
|
email: false
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Жизнь в Берлине и Германии
|
# Жизнь в Берлине и Германии
|
||||||
|
|
||||||
-В этом репозитории собрана полезная информация о жизни в Берлине баобабка, а также в целом в Германии: руководства, советы, ответы на часто задаваемые вопросы. Основная первоначальная аудитория: айтишники (программисты, sysops и т.д.), переехавшие в Берлин работать по программе Blue Card из Украины, России и других стран.
|
-В этом репозитории пумпум cam ывадлоы вадло собрана полезная информация о жизни в Берлине баобабка, а также в целом в Германии: руководства, советы, ответы на часто задаваемые вопросы. Основная первоначальная аудитория: айтишники (программисты, sysops и т.д.), переехавшие в Берлин работать по программе Blue Card из Украины, России и других стран.
|
||||||
|
|
||||||
Вы очень поможете, если поделитесь своим ценным и полезным опытом, исправите устаревшую информацию или сообщите о ней. Это можно сделать прямо в интерфейсе GitHub: вверху каждой страницы есть кнопка редактирования (иконка выглядит как карандаш). При нажатии на неё автоматически создаётся ваш личный клон этого репозитория. Дальше вы можете редактировать файлы в вашем клоне. Когда готово — отправляете pull request в головной репозиторий. Всё делается прямо на сайте, консоль или другие программы использовать не требуется.
|
Вы очень поможете, если поделитесь своим ценным и полезным опытом, исправите устаревшую информацию или сообщите о ней. Это можно сделать прямо в интерфейсе GitHub: вверху каждой страницы есть кнопка редактирования (иконка выглядит как карандаш). При нажатии на неё автоматически создаётся ваш личный клон этого репозитория. Дальше вы можете редактировать файлы в вашем клоне. Когда готово — отправляете pull request в головной репозиторий. Всё делается прямо на сайте, консоль или другие программы использовать не требуется.
|
||||||
|
|
||||||
|
@ -27,4 +27,7 @@ for dic in $dicList
|
|||||||
cat /usr/share/hunspell/$dic.aff | iconv --from ISO8859-1 --to UTF-8 | sed 's/SET ISO8859-1/SET UTF-8/' > /usr/share/hunspell/$dic-utf8.aff
|
cat /usr/share/hunspell/$dic.aff | iconv --from ISO8859-1 --to UTF-8 | sed 's/SET ISO8859-1/SET UTF-8/' > /usr/share/hunspell/$dic-utf8.aff
|
||||||
done
|
done
|
||||||
|
|
||||||
go get -u github.com/russross/blackfriday-tool
|
go get -u github.com/ewgRa/ci-utils/diff_liner/diff_liner
|
||||||
|
go get -u github.com/ewgRa/ci-utils/hunspell_parser/hunspell_parser
|
||||||
|
go get -u github.com/ewgRa/ci-utils/diff_liner/links_checker
|
||||||
|
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
DIR=`dirname $0`
|
DIR=`dirname $0`
|
||||||
EXIT_CODE=0
|
|
||||||
|
|
||||||
git config --global core.quotepath false
|
git config --global core.quotepath false
|
||||||
|
|
||||||
|
go build -o /tmp/check_spell $DIR/check_spell.go
|
||||||
|
go build -o /tmp/check_links $DIR/check_links.go
|
||||||
|
|
||||||
(cat $DIR/dictionary.dic; echo) | sed '/^$/d' | wc -l > /tmp/dictionary.dic
|
(cat $DIR/dictionary.dic; echo) | sed '/^$/d' | wc -l > /tmp/dictionary.dic
|
||||||
(cat $DIR/dictionary.dic; echo) | sed '/^$/d' >> /tmp/dictionary.dic
|
(cat $DIR/dictionary.dic; echo) | sed '/^$/d' >> /tmp/dictionary.dic
|
||||||
|
|
||||||
@ -13,54 +15,32 @@ sudo mv /tmp/dictionary.* /usr/share/hunspell
|
|||||||
|
|
||||||
git diff HEAD^ --name-status | grep "^D" -v | sed 's/^.\t//g' | grep "\.md$" > /tmp/changed_files
|
git diff HEAD^ --name-status | grep "^D" -v | sed 's/^.\t//g' | grep "\.md$" > /tmp/changed_files
|
||||||
|
|
||||||
go build -o /tmp/spell-checker $DIR/spell-checker.go
|
curl -sH "Accept: application/vnd.github.v3.diff.json" https://api.github.com/repos/$TRAVIS_REPO_SLUG/pulls/$TRAVIS_PULL_REQUEST > /tmp/pr.diff
|
||||||
|
cat /tmp/pr.diff | diff_liner > /tmp/pr_liner.json
|
||||||
|
|
||||||
|
rm -f /tmp/comments.json
|
||||||
|
touch /tmp/comments.json
|
||||||
|
|
||||||
while read FILE; do
|
while read FILE; do
|
||||||
echo -n "Проверка файла $FILE на опечатки... ";
|
echo -n "Проверка изменений в файле $FILE на опечатки... ";
|
||||||
|
|
||||||
OUTPUT=$(cat "$FILE" | sed 's/https\?:[^ ]*//g' | sed "s/[(][^)]*\.md[)]//g" | sed "s/[(]files[^)]*[)]//g" | hunspell -d dictionary,russian-aot-utf8,ru_RU,de_DE-utf8,en_US-utf8 | /tmp/spell-checker);
|
cat "$FILE" | sed 's/https\?:[^ ]*//g' | sed "s/[(][^)]*\.md[)]//g" | sed "s/[(]files[^)]*[)]//g" | hunspell -d dictionary,russian-aot-utf8,ru_RU,de_DE-utf8,en_US-utf8 > /tmp/hunspell.out
|
||||||
OUTPUT_EXIT_CODE=$?
|
cat /tmp/hunspell.out | hunspell_parser > /tmp/hunspell_parsed.json
|
||||||
|
/tmp/check_spell -file "$FILE" -pr-liner /tmp/pr_liner.json -hunspell-parsed-file /tmp/hunspell_parsed.json >> /tmp/comments.json
|
||||||
|
|
||||||
if [ $OUTPUT_EXIT_CODE -ne 0 ]; then
|
echo -n "Проверка изменений в файле $FILE на недоступные ссылки... ";
|
||||||
EXIT_CODE=1
|
|
||||||
echo "ошибка";
|
|
||||||
echo "$OUTPUT";
|
|
||||||
else
|
|
||||||
echo "пройдена";
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -f /tmp/file.html
|
/tmp/check_links -file "$FILE" -pr-liner /tmp/pr_liner.json -expected-codes files/expected_codes.csv >> /tmp/comments.json
|
||||||
blackfriday-tool "$FILE" /tmp/file.html
|
|
||||||
|
|
||||||
if [ -f "/tmp/file.html" ]; then
|
|
||||||
grep -Po '(?<=href=")http[^"]*(?=")' "/tmp/file.html" > /tmp/links
|
|
||||||
|
|
||||||
if [ -s /tmp/links ]; then
|
|
||||||
echo "Проверка файла $FILE на недоступные ссылки... ";
|
|
||||||
|
|
||||||
while read LINK; do
|
|
||||||
REGEXP_LINK=$(echo $LINK | sed 's/[]\.|$(){}?+*^[]/\\&/g')
|
|
||||||
LINK=$(echo "$LINK" | sed -e 's/\[/\\\[/g' -e 's/\]/\\\]/g' -e 's/\&/\&/g')
|
|
||||||
status=$(curl --insecure -XGET -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" -m 10 -L -s --head -w %{http_code} $LINK -o /dev/null)
|
|
||||||
expectedStatus=$(grep -oP "[^,]+,$REGEXP_LINK$" $DIR/known_url.csv | cut -d',' -f1)
|
|
||||||
|
|
||||||
if [ -z "$expectedStatus" ]; then
|
|
||||||
expectedStatus="200"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$status" != "$expectedStatus" -a "$status" != "200" ]; then
|
|
||||||
EXIT_CODE=1
|
|
||||||
echo "Ссылка $LINK ... недоступна с кодом $status, ожидается $expectedStatus";
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
done < /tmp/links
|
|
||||||
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
done < /tmp/changed_files
|
done < /tmp/changed_files
|
||||||
|
|
||||||
|
OUTPUT=$(cat /tmp/comments.json | (! grep .));
|
||||||
|
OUTPUT_EXIT_CODE=$?
|
||||||
|
|
||||||
|
if [ $OUTPUT_EXIT_CODE -ne 0 ]; then
|
||||||
|
# FIXME XXX: send to github
|
||||||
|
EXIT_CODE=1
|
||||||
|
fi
|
||||||
|
|
||||||
exit $EXIT_CODE
|
exit $EXIT_CODE
|
||||||
|
89
files/check_links.go
Normal file
89
files/check_links.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"flag"
|
||||||
|
"bufio"
|
||||||
|
"regexp"
|
||||||
|
"github.com/ewgRa/ci-utils/diff_liner"
|
||||||
|
"github.com/ewgRa/ci-utils/links_checker"
|
||||||
|
"gopkg.in/russross/blackfriday.v2"
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/google/go-github/github"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
prLiner := flag.String("pr-liner", "", "Pull request liner")
|
||||||
|
fileName := flag.String("file", "", "Hunspell parsed file name")
|
||||||
|
expectedCodesFile := flag.String("expected-codes", "", "Expected codes file name")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if *prLiner == "" || *fileName == "" || *expectedCodesFile == "" {
|
||||||
|
flag.Usage()
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
linkRegexp := regexp.MustCompile("href=\"(http[^\"]*)\"")
|
||||||
|
|
||||||
|
linerResp := diff_liner.ReadLinerResponse(*prLiner)
|
||||||
|
checker := links_checker.NewChecker(*expectedCodesFile)
|
||||||
|
|
||||||
|
line := 0
|
||||||
|
|
||||||
|
file, err := os.Open(*fileName)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line++
|
||||||
|
|
||||||
|
prLine := linerResp.GetDiffLine(*fileName, line)
|
||||||
|
|
||||||
|
if prLine == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
output := blackfriday.Run(scanner.Bytes())
|
||||||
|
matches := linkRegexp.FindAllStringSubmatch(string(output), -1)
|
||||||
|
|
||||||
|
for _, match := range matches {
|
||||||
|
link := match[1]
|
||||||
|
|
||||||
|
ok, respCode, expectedCodes := checker.Check(link)
|
||||||
|
|
||||||
|
if ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
body := fmt.Sprintf("Ссылка %s ... недоступна с кодом %v, ожидается %v. Если это ожидаемый ответ, внесите \"%v,%s\" в files/expected_codes.csv", link, respCode, expectedCodes, respCode, link)
|
||||||
|
commitID := "FIXME XXX"
|
||||||
|
|
||||||
|
comment := &github.PullRequestComment{
|
||||||
|
Body: &body,
|
||||||
|
CommitID: &commitID,
|
||||||
|
Path: fileName,
|
||||||
|
Position: &prLine,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonData, err := json.Marshal(comment)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(string(jsonData))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
53
files/check_spell.go
Normal file
53
files/check_spell.go
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"github.com/ewgRa/ci-utils/diff_liner"
|
||||||
|
"github.com/ewgRa/ci-utils/hunspell_parser"
|
||||||
|
"github.com/google/go-github/github"
|
||||||
|
"flag"
|
||||||
|
"encoding/json"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
prLiner := flag.String("pr-liner", "", "Pull request liner")
|
||||||
|
hunspellParsedFile := flag.String("hunspell-parsed-file", "", "Hunspell parsed file name")
|
||||||
|
file := flag.String("file", "", "Hunspell parsed file name")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if *prLiner == "" || *hunspellParsedFile == "" || *file == "" {
|
||||||
|
flag.Usage()
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
linerResp := diff_liner.ReadLinerResponse(*prLiner)
|
||||||
|
|
||||||
|
hunspellParsedResp := hunspell_parser.ReadHunspellParserResponse(*hunspellParsedFile)
|
||||||
|
|
||||||
|
for _, resp := range hunspellParsedResp {
|
||||||
|
prLine := linerResp.GetDiffLine(*file, resp.Line)
|
||||||
|
|
||||||
|
if prLine == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
body := fmt.Sprintf("Возможная ошибка в слове \"%s\", варианты правильного написания \"%s\". Если слово \"%s\" является правильным, добавьте его в files/dictionary.dic", resp.Word, resp.Alternative, resp.Word)
|
||||||
|
commitID := "FIXME XXX"
|
||||||
|
|
||||||
|
comment := &github.PullRequestComment{
|
||||||
|
Body: &body,
|
||||||
|
CommitID: &commitID,
|
||||||
|
Path: file,
|
||||||
|
Position: &prLine,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonData, err := json.Marshal(comment)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(string(jsonData))
|
||||||
|
}
|
||||||
|
}
|
@ -1,69 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"bufio"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
type TypeResult struct {
|
|
||||||
results []Result
|
|
||||||
}
|
|
||||||
|
|
||||||
type Result struct {
|
|
||||||
line int
|
|
||||||
word string
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
scanner := bufio.NewScanner(os.Stdin)
|
|
||||||
types := parseHunspellOutput(scanner);
|
|
||||||
|
|
||||||
_, ok := types["&"]
|
|
||||||
|
|
||||||
if ok {
|
|
||||||
var dropCol = regexp.MustCompile(`^([^ ]+) \d+ \d+:(.*)$`)
|
|
||||||
var minimumWord = regexp.MustCompile(`^[^ ]{3}`)
|
|
||||||
exitCode := 0
|
|
||||||
|
|
||||||
for _, result := range types["&"].results {
|
|
||||||
if minimumWord.MatchString(result.word) {
|
|
||||||
exitCode = 1
|
|
||||||
fmt.Println("Строка " + fmt.Sprintf("%v", result.line) + ": " + dropCol.ReplaceAllString(result.word, "$1 >$2"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Exit(exitCode)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseHunspellOutput(scanner *bufio.Scanner) map[string]*TypeResult {
|
|
||||||
line := 1;
|
|
||||||
types := make(map[string]*TypeResult)
|
|
||||||
|
|
||||||
scanner.Scan()
|
|
||||||
|
|
||||||
for scanner.Scan() {
|
|
||||||
text := scanner.Text()
|
|
||||||
|
|
||||||
if text == "" {
|
|
||||||
line++;
|
|
||||||
} else {
|
|
||||||
resultType := text[0:1]
|
|
||||||
|
|
||||||
typeResult, ok := types[resultType]
|
|
||||||
|
|
||||||
if !ok {
|
|
||||||
typeResult = &TypeResult{}
|
|
||||||
types[resultType] = typeResult
|
|
||||||
}
|
|
||||||
|
|
||||||
typeResult.results = append(typeResult.results, Result{line: line, word: strings.Trim(text[1:], " ")})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return types
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user