{"id":33314092,"url":"https://github.com/ivnstn/teamtools.linter.commandline","last_synced_at":"2025-11-19T12:00:59.911Z","repository":{"id":324901965,"uuid":"1090870890","full_name":"IVNSTN/TeamTools.Linter.CommandLine","owner":"IVNSTN","description":"Static code analysis tool for T-SQL scripts and SSDT projects","archived":false,"fork":false,"pushed_at":"2025-11-18T13:50:49.000Z","size":87,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-11-18T15:56:41.243Z","etag":null,"topics":["code-analysis-tool","code-quality","code-smell","database","linter","rdl","sql-server","ssdt","static-analysis","tsql"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/IVNSTN.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-06T08:50:03.000Z","updated_at":"2025-11-18T15:49:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/IVNSTN/TeamTools.Linter.CommandLine","commit_stats":null,"previous_names":["ivnstn/teamtools.linter.commandline"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/IVNSTN/TeamTools.Linter.CommandLine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IVNSTN%2FTeamTools.Linter.CommandLine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IVNSTN%2FTeamTools.Linter.CommandLine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IVNSTN%2FTeamTools.Linter.CommandLine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IVNSTN%2FTeamTools.Linter.CommandLine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/IVNSTN","download_url":"https://codeload.github.com/IVNSTN/TeamTools.Linter.CommandLine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IVNSTN%2FTeamTools.Linter.CommandLine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":285240542,"owners_count":27137943,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-19T02:00:05.673Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-analysis-tool","code-quality","code-smell","database","linter","rdl","sql-server","ssdt","static-analysis","tsql"],"created_at":"2025-11-19T12:00:25.029Z","updated_at":"2025-11-19T12:00:59.897Z","avatar_url":"https://github.com/IVNSTN.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿\n# TeamTools Linter CommandLine\n\nУтилита командной строки для выполнения линтинга с поддержкой подключаемых плагинов.\n\n## Плагины\n\nНапример, IVNSTN/TeamTools.Linter.TSQL для статического анализа кода на **T-SQL**.\nПеречень плагинов необходимо указать в [конфигурационном файле](./TeamTools.Linter.CommandLine/DefaultConfig.json).\n\n## Параметры\n\n|Параметр|Сокращение|Описание|\n|-|-|-|\n| `--config`| `-c` | Путь к конфигурационному файлу\n| `--dir` | `-d` | Путь к директорию, все файлы которой нужно линтить\n| `--file` | `-f` | Путь к одному файлу, который нужно линтить\n| `--filelist` | `-l` | Путь к текстовому файлу, в котором перечислены один или несколько полный путей к файлам, которые нужно линтить.\n| `--output` | `-o` | Путь к файлу, в который нужно сохранить результат либо `console` для выдачи обнаруженных замечаний в терминал.\n| `--format` | `-m` | В каком виде оформить результат: json, sonar или text. Параметр учитывается только если в `output` указан путь к файлу для сорахнения результата.\n| `--severity` | `-s` | Минимальный уровень серьезности замечаний, которые должны быть учтены в результате линтинга. По умолчанию - info, то есть все ошибки (error), предупреждения (warning), предложения и информационные сообщения (info или hint). Если требуются только серьёзные замечания, то необходимо передать значение warning (явные ошибки и предупреждения) или error (только явные ошибки). Серьезность замечаний по каждому нарушенному правилу указывается в конфигурации плагина.\n| `--basepath` | `-r` | Базовый путь к файлам. Если указан, то вместо абсолютных путей к файлам в логе и в итоговом файле будут указаны относительные пути с базой, заданной в этом параметре.\n| `--verbose` | `-v` | Выводить подробности о ходе выполнения линтинга в консоль\n| `--withversion` | `-n` | Перед выдачей результата в консоль сначала напечатать номер версии. При вызове с параметром `--version` никаких других действий выполняться не будет. А с параметром `--withversion` можно и линтинг запустить, и текущую версию сразу в логе увидеть.\n| `--diff` | | Линтить все файлы, отличающиеся от ветки master. Работает только при запуске на файлах, размещенных в GIT-репозитории. Путь к git.exe должен быть включен в PATH. Вместо этого параметра схожего эффекта можно добиться, предварительно вычислив набор файлов, подлежащих линтингу. Этот список полных путей к файлам нужно сохранить в простой текстовый файл и путь к нему передать в параметре `--filelist`\n| `--quiet` | | Не устанавливать ненулевой код возврата в случае обнаружения замечаний линтера\n| `--version` | | Вывести номер версии утилиты без выполнения других операций\n| `--help` | | Отобразить список параметров\n\n\n## Примеры вызова\n\n### Линтинг диффа по каталогу\n\n```cmd\n.\\TeamTools.Linter.CommandLine.exe --dir \"c:\\source\\my_project\"  --diff\n```\n\nДифф вычисляется по Git относительно главной ветки, в итоге сканируются только изменённые файлы. Имя главной ветки можно указать в конфигурационном файле.\n\n### Линтинг конкретного файла\n\n```cmd\n.\\TeamTools.Linter.CommandLine.exe --file \"c:\\source\\my_project\\Stored procedures\\dbo.my_proc.sql\"\n```\n\n### Линтинг всех файлов директории без учета info-сообщений\n\n```cmd\n.\\TeamTools.Linter.CommandLine.exe --dir \"c:\\source\\my_project\"  --severity warning\n```\n\n## Интеграция\n\nУтилитой можно пользоваться напрямую, вызывая её в терминале, а можно встроить в некоторые инструменты.\n\n### SSMS External Tool\n\nВыполнить линтинг файла, открытого в текущей вкладке SSM можно с помощью настраиваемого пункта меню.\nДля создания нового пункта меню зайдите в Tools / External Tools, добавьте новый элемент и настройте как показано ниже.\n\n```ini\nCommand           = \u003cpath to exe\u003e\\TeamTools.Linter.CommandLine.exe\nArguments         = --file $(ItemPath) --with-version\nInitial directory = \u003cпусто\u003e\nUse output window = поставьте галочку\n```\n\nв поле \"Arguments\". В поле \"Initial directory\" введите путь к директории с исполняемым файлом линтера (такой же как в поле \"Command\", но без имени файла самого exe). Поставьте галочку \"Use output window\", остальные пусть останутся снятыми.\n\nТеперь можно линтить файл в открытой вкладке SSMS: нажмите правой клавишей мыши на заголовке открытой вкладки и выберите пункт меню, название которого выбрали для только что добавленного элемента \"External tools\".\n\n## Visual Studio External Tool\n\nНастройка команды для линтинга конкретного файла аналогична приведенной выше для SSMS, здесь же приводится пример\nдля поиска стопперов во всём имеющемся диффе с главной веткой в текущем репозитории:\n\n```ini\nCommand           = \u003cpath to exe\u003e\\TeamTools.Linter.CommandLine.exe\nArguments         = --diff --severity warning --with-version\nInitial directory = $(SolutionDir)\nUse output window = поставьте галочку\n```\n\n### SourceTree Custom Action\n\nОткройте пункт меню Tools/Options в SourceTree, выберите вкладку \"Custom actions\" и добавьте новый элемент в список. Далее введите полный путь к исполняемому файлу линтера в поле \"Script to run\" и приведенную ниже строку в поле \"Parameter\":\n\n`--file \"$REPO\\$FILE\" --severity warning --verbose`\n\n\nТеперь можно линтить выбранный файл прямо из интерфейса **SourceTree**.\n\n### GIT hook\n\nИзмененные файлы можно автоматически линтить перед пушем или даже перед коммитом. Для этого добавьте в соответствующее событие вызов скрипта, пример которого приведен ниже.\nВ качестве первого и единственного параметра передайте ему полный путь к папке, в которой находится `TeamTools.Linter.CommandLine.exe`\nЧтобы результат был похожим на линтинг в пайплайне CI, можно ограничить минимальную серьезность замечаний при помощи параметра `--severity`.\n\n```sh\n#!/bin/bash\n\nlinter_folder=\"$1\"\necho \"linter: $linter_folder\"\n\nrepo_path=\"$(git rev-parse --show-toplevel)\"\necho \"repository: $repo_path\"\n\n\"$linter_folder/TeamTools.Linter.CommandLine.exe\" \\\n    --config \"$linter_folder/DefaultConfig.json\" \\\n    --dir \"$repo_path\" \\\n    --basepath \"$repo_path\" \\\n    --output console \\\n    --severity warning \\\n    --diff \\\n    --withversion\n\nlast_exit_code=$?\n\nif [ $last_exit_code -ne 0 ]; then\n    echo \"=======\"\n    echo \"Linting failed. See errors and warnings above.\"\n    echo \"All the stoppers must be fixed before pushing branch to server.\"\n    echo \"=======\"\n\n    exit $last_exit_code\nfi\n```\n\n### CI pipeline\n\nВ пайплайн сборки утилита интегрируется схожим образом: сконструируйте консольный вызов с нужными параметрами и добавьте этот вызов в качестве шага пайплайна. Если не нужно, чтобы обнаружение замечаний роняло билд (например вы отдаете принятие решения на откуп Quality Gate в SonarQube), то добавьте параметр `--quiet` и тогда ExitCode всегда будет 0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivnstn%2Fteamtools.linter.commandline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivnstn%2Fteamtools.linter.commandline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivnstn%2Fteamtools.linter.commandline/lists"}