From e3274af83126d776c85ac10a8ee8a281153613a8 Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Wed, 9 Aug 2023 10:17:58 +0300 Subject: [PATCH 01/14] A (still) hacky way to clip description and commit messages --- pr_agent/algo/pr_processing.py | 22 ++++++++++++++++++++++ pr_agent/tools/pr_reviewer.py | 4 +++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/pr_agent/algo/pr_processing.py b/pr_agent/algo/pr_processing.py index 8b319446..be3a461b 100644 --- a/pr_agent/algo/pr_processing.py +++ b/pr_agent/algo/pr_processing.py @@ -284,3 +284,25 @@ def find_line_number_of_relevant_line_in_file(diff_files: List[FilePatchInfo], absolute_position = start2 + delta - 1 break return position, absolute_position + + +def clip_tokens(text: str, max_tokens: int) -> str: + """ + Clip the number of tokens in a string to a maximum number of tokens. + + Args: + text (str): The string to clip. + max_tokens (int): The maximum number of tokens allowed in the string. + + Returns: + str: The clipped string. + """ + # We'll estimate the number of tokens by hueristically assuming 2.5 tokens per word + words = re.finditer(r'\S+', text) + max_words = max_tokens // 2.5 + end_pos = None + for i, token in enumerate(words): + if i == max_words: + end_pos = token.start() + break + return text if end_pos is None else text[:end_pos] \ No newline at end of file diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index 982f5000..982f18cc 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -8,7 +8,7 @@ from jinja2 import Environment, StrictUndefined from pr_agent.algo.ai_handler import AiHandler from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models, \ - find_line_number_of_relevant_line_in_file + find_line_number_of_relevant_line_in_file, clip_tokens from pr_agent.algo.token_handler import TokenHandler from pr_agent.algo.utils import convert_to_markdown, try_fix_json from pr_agent.config_loader import get_settings @@ -62,6 +62,8 @@ class PRReviewer: "extra_instructions": get_settings().pr_reviewer.extra_instructions, "commit_messages_str": self.git_provider.get_commit_messages(), } + self.vars["description"] = clip_tokens(self.vars["description"], 500) + self.vars["commit_messages_str"] = clip_tokens(self.vars["commit_messages_str"], 500) self.token_handler = TokenHandler( self.git_provider.pr, From e0f295659dbc33c681dfd95859f149b3c5aae854 Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Wed, 9 Aug 2023 12:17:54 +0300 Subject: [PATCH 02/14] A less hacky way --- pr_agent/algo/pr_processing.py | 19 ++++++++++--------- pr_agent/algo/token_handler.py | 6 +++++- pr_agent/git_providers/bitbucket_provider.py | 4 ++++ pr_agent/git_providers/git_provider.py | 4 ++++ pr_agent/git_providers/github_provider.py | 12 +++++++++--- pr_agent/git_providers/gitlab_provider.py | 11 +++++++++-- pr_agent/settings/configuration.toml | 2 ++ pr_agent/tools/pr_reviewer.py | 2 -- 8 files changed, 43 insertions(+), 17 deletions(-) diff --git a/pr_agent/algo/pr_processing.py b/pr_agent/algo/pr_processing.py index be3a461b..b195f9f4 100644 --- a/pr_agent/algo/pr_processing.py +++ b/pr_agent/algo/pr_processing.py @@ -11,7 +11,7 @@ from github import RateLimitExceededException from pr_agent.algo import MAX_TOKENS from pr_agent.algo.git_patch_processing import convert_to_hunks_with_lines_numbers, extend_patch, handle_patch_deletions from pr_agent.algo.language_handler import sort_files_by_main_languages -from pr_agent.algo.token_handler import TokenHandler +from pr_agent.algo.token_handler import TokenHandler, get_token_encoder from pr_agent.config_loader import get_settings from pr_agent.git_providers.git_provider import FilePatchInfo, GitProvider @@ -298,11 +298,12 @@ def clip_tokens(text: str, max_tokens: int) -> str: str: The clipped string. """ # We'll estimate the number of tokens by hueristically assuming 2.5 tokens per word - words = re.finditer(r'\S+', text) - max_words = max_tokens // 2.5 - end_pos = None - for i, token in enumerate(words): - if i == max_words: - end_pos = token.start() - break - return text if end_pos is None else text[:end_pos] \ No newline at end of file + encoder = get_token_encoder() + num_input_tokens = len(encoder.encode(text)) + if num_input_tokens <= max_tokens: + return text + num_chars = len(text) + chars_per_token = num_chars / num_input_tokens + num_output_chars = int(chars_per_token * max_tokens) + clipped_text = text[:num_output_chars] + return clipped_text diff --git a/pr_agent/algo/token_handler.py b/pr_agent/algo/token_handler.py index 3686f521..f018a92b 100644 --- a/pr_agent/algo/token_handler.py +++ b/pr_agent/algo/token_handler.py @@ -4,6 +4,10 @@ from tiktoken import encoding_for_model, get_encoding from pr_agent.config_loader import get_settings +def get_token_encoder(): + return encoding_for_model(get_settings().config.model) if "gpt" in get_settings().config.model else get_encoding( + "cl100k_base") + class TokenHandler: """ A class for handling tokens in the context of a pull request. @@ -27,7 +31,7 @@ class TokenHandler: - system: The system string. - user: The user string. """ - self.encoder = encoding_for_model(get_settings().config.model) if "gpt" in get_settings().config.model else get_encoding("cl100k_base") + self.encoder = get_token_encoder() self.prompt_tokens = self._get_system_user_tokens(pr, self.encoder, vars, system, user) def _get_system_user_tokens(self, pr, encoder, vars: dict, system, user): diff --git a/pr_agent/git_providers/bitbucket_provider.py b/pr_agent/git_providers/bitbucket_provider.py index 122b0db3..07b92295 100644 --- a/pr_agent/git_providers/bitbucket_provider.py +++ b/pr_agent/git_providers/bitbucket_provider.py @@ -5,6 +5,7 @@ from urllib.parse import urlparse import requests from atlassian.bitbucket import Cloud +from ..algo.pr_processing import clip_tokens from ..config_loader import get_settings from .git_provider import FilePatchInfo @@ -81,6 +82,9 @@ class BitbucketProvider: return self.pr.source_branch def get_pr_description(self): + max_tokens = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None) + if max_tokens: + return clip_tokens(self.pr.description, max_tokens) return self.pr.description def get_user_id(self): diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index 8e161252..2a891938 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -97,6 +97,10 @@ class GitProvider(ABC): def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: pass + @abstractmethod + def get_commit_messages(self): + pass + def get_main_pr_language(languages, files) -> str: """ Get the main language of the commit. Return an empty string if cannot determine. diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index bc5cc6a7..dbad5388 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -12,7 +12,7 @@ from starlette_context import context from .git_provider import FilePatchInfo, GitProvider, IncrementalPR from ..algo.language_handler import is_valid_file from ..algo.utils import load_large_diff -from ..algo.pr_processing import find_line_number_of_relevant_line_in_file +from ..algo.pr_processing import find_line_number_of_relevant_line_in_file, clip_tokens from ..config_loader import get_settings from ..servers.utils import RateLimitExceeded @@ -234,6 +234,9 @@ class GithubProvider(GitProvider): return self.pr.head.ref def get_pr_description(self): + max_tokens = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None) + if max_tokens: + return clip_tokens(self.pr.body, max_tokens) return self.pr.body def get_user_id(self): @@ -375,19 +378,22 @@ class GithubProvider(GitProvider): logging.exception(f"Failed to get labels, error: {e}") return [] - def get_commit_messages(self) -> str: + def get_commit_messages(self): """ Retrieves the commit messages of a pull request. Returns: str: A string containing the commit messages of the pull request. """ + max_tokens = get_settings().get("CONFIG.MAX_COMMITS_TOKENS", None) try: commit_list = self.pr.get_commits() commit_messages = [commit.commit.message for commit in commit_list] commit_messages_str = "\n".join([f"{i + 1}. {message}" for i, message in enumerate(commit_messages)]) - except: + except Exception: commit_messages_str = "" + if max_tokens: + commit_messages_str = clip_tokens(commit_messages_str, max_tokens) return commit_messages_str def generate_link_to_relevant_line_number(self, suggestion) -> str: diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index a4d2d127..73a3a2f9 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -7,6 +7,7 @@ import gitlab from gitlab import GitlabGetError from ..algo.language_handler import is_valid_file +from ..algo.pr_processing import clip_tokens from ..algo.utils import load_large_diff from ..config_loader import get_settings from .git_provider import EDIT_TYPE, FilePatchInfo, GitProvider @@ -275,6 +276,9 @@ class GitLabProvider(GitProvider): return self.mr.source_branch def get_pr_description(self): + max_tokens = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None) + if max_tokens: + return clip_tokens(self.mr.description, max_tokens) return self.mr.description def get_issue_comments(self): @@ -338,16 +342,19 @@ class GitLabProvider(GitProvider): def get_labels(self): return self.mr.labels - def get_commit_messages(self) -> str: + def get_commit_messages(self): """ Retrieves the commit messages of a pull request. Returns: str: A string containing the commit messages of the pull request. """ + max_tokens = get_settings().get("CONFIG.MAX_COMMITS_TOKENS", None) try: commit_messages_list = [commit['message'] for commit in self.mr.commits()._list] commit_messages_str = "\n".join([f"{i + 1}. {message}" for i, message in enumerate(commit_messages_list)]) - except: + except Exception: commit_messages_str = "" + if max_tokens: + commit_messages_str = clip_tokens(commit_messages_str, max_tokens) return commit_messages_str \ No newline at end of file diff --git a/pr_agent/settings/configuration.toml b/pr_agent/settings/configuration.toml index 8334049d..0c502df9 100644 --- a/pr_agent/settings/configuration.toml +++ b/pr_agent/settings/configuration.toml @@ -8,6 +8,8 @@ verbosity_level=0 # 0,1,2 use_extra_bad_extensions=false use_repo_settings_file=true ai_timeout=180 +max_description_tokens = 500 +max_commits_tokens = 500 [pr_reviewer] # /review # require_focused_review=true diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index 982f18cc..f679851b 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -62,8 +62,6 @@ class PRReviewer: "extra_instructions": get_settings().pr_reviewer.extra_instructions, "commit_messages_str": self.git_provider.get_commit_messages(), } - self.vars["description"] = clip_tokens(self.vars["description"], 500) - self.vars["commit_messages_str"] = clip_tokens(self.vars["commit_messages_str"], 500) self.token_handler = TokenHandler( self.git_provider.pr, From f1f271fa00293ac75cbbf7a3aa8dc067482e8b6a Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 00:44:00 +0300 Subject: [PATCH 03/14] PyYAML dependency --- pyproject.toml | 3 ++- requirements.txt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4ca0c0b6..2e8f2b5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,8 @@ dependencies = [ "atlassian-python-api==3.39.0", "GitPython~=3.1.32", "starlette-context==0.3.6", - "litellm~=0.1.351" + "litellm~=0.1.351", + "PyYAML==6.0" ] [project.urls] diff --git a/requirements.txt b/requirements.txt index 07a33514..0d2c6239 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,5 @@ pytest~=7.4.0 aiohttp~=3.8.4 atlassian-python-api==3.39.0 GitPython~=3.1.32 -litellm~=0.1.351 \ No newline at end of file +litellm~=0.1.351 +PyYAML==6.0 From e00500b90cd3a09a453a7dfc62c902562dfd9eb4 Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 00:56:28 +0300 Subject: [PATCH 04/14] PyYAML dependency --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index 0d2c6239..ebea2b71 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,3 +13,5 @@ atlassian-python-api==3.39.0 GitPython~=3.1.32 litellm~=0.1.351 PyYAML==6.0 +starlette-context==0.3.6 +litellm~=0.1.351 \ No newline at end of file From 725ac9e85dedff726e509e253949f01bbf6aa4fc Mon Sep 17 00:00:00 2001 From: Itamar Friedman Date: Thu, 10 Aug 2023 01:30:12 +0300 Subject: [PATCH 05/14] fixing cli pr_url help description --- pr_agent/cli.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pr_agent/cli.py b/pr_agent/cli.py index 8dd21b3f..0f871041 100644 --- a/pr_agent/cli.py +++ b/pr_agent/cli.py @@ -10,13 +10,13 @@ from pr_agent.config_loader import get_settings def run(inargs=None): parser = argparse.ArgumentParser(description='AI based pull request analyzer', usage= """\ -Usage: cli.py --pr-url []. +Usage: cli.py --pr-url= []. For example: -- cli.py --pr-url=... review -- cli.py --pr-url=... describe -- cli.py --pr-url=... improve -- cli.py --pr-url=... ask "write me a poem about this PR" -- cli.py --pr-url=... reflect +- cli.py --pr_url=... review +- cli.py --pr_url=... describe +- cli.py --pr_url=... improve +- cli.py --pr_url=... ask "write me a poem about this PR" +- cli.py --pr_url=... reflect Supported commands: review / review_pr - Add a review that includes a summary of the PR and specific suggestions for improvement. @@ -27,7 +27,7 @@ reflect - Ask the PR author questions about the PR. update_changelog - Update the changelog based on the PR's contents. To edit any configuration parameter from 'configuration.toml', just add -config_path=. -For example: '- cli.py --pr-url=... review --pr_reviewer.extra_instructions="focus on the file: ..."' +For example: 'python cli.py --pr_url=... review --pr_reviewer.extra_instructions="focus on the file: ..."' """) parser.add_argument('--pr_url', type=str, help='The URL of the PR to review', required=True) parser.add_argument('command', type=str, help='The', choices=commands, default='review') From 3e09b9ac370e3dd6aa772d4a517db16f91fc24b0 Mon Sep 17 00:00:00 2001 From: Itamar Friedman Date: Thu, 10 Aug 2023 01:31:06 +0300 Subject: [PATCH 06/14] fixing pr_url param description (was wrongly mentioned as `pr-url`) --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b8ab88c9..0ec00ec2 100644 --- a/README.md +++ b/README.md @@ -97,12 +97,12 @@ CodiumAI `PR-Agent` is an open-source tool aiming to help developers review pull | | Incremental PR Review | :white_check_mark: | | | Examples for invoking the different tools via the CLI: -- **Review**: python cli.py --pr-url= review -- **Describe**: python cli.py --pr-url= describe -- **Improve**: python cli.py --pr-url= improve -- **Ask**: python cli.py --pr-url= ask "Write me a poem about this PR" -- **Reflect**: python cli.py --pr-url= reflect -- **Update Changelog**: python cli.py --pr-url= update_changelog +- **Review**: python cli.py --pr_url= review +- **Describe**: python cli.py --pr_url= describe +- **Improve**: python cli.py --pr_url= improve +- **Ask**: python cli.py --pr_url= ask "Write me a poem about this PR" +- **Reflect**: python cli.py --pr_url= reflect +- **Update Changelog**: python cli.py --pr_url= update_changelog "" is the url of the relevant PR (for example: https://github.com/Codium-ai/pr-agent/pull/50). From 0270306d3ca65e2a218f6eabe55686902b7e59fc Mon Sep 17 00:00:00 2001 From: Itamar Friedman Date: Thu, 10 Aug 2023 01:34:24 +0300 Subject: [PATCH 07/14] litellm was mentioned twice in the requirements.txt --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index ebea2b71..ea2cacdf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,5 +13,4 @@ atlassian-python-api==3.39.0 GitPython~=3.1.32 litellm~=0.1.351 PyYAML==6.0 -starlette-context==0.3.6 -litellm~=0.1.351 \ No newline at end of file +starlette-context==0.3.6 \ No newline at end of file From b206b1c5ff42ed77943b72d0758f89d050348027 Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 02:08:36 +0300 Subject: [PATCH 08/14] Protect for empty description --- pr_agent/algo/pr_processing.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/pr_agent/algo/pr_processing.py b/pr_agent/algo/pr_processing.py index b195f9f4..3a08a86d 100644 --- a/pr_agent/algo/pr_processing.py +++ b/pr_agent/algo/pr_processing.py @@ -298,12 +298,16 @@ def clip_tokens(text: str, max_tokens: int) -> str: str: The clipped string. """ # We'll estimate the number of tokens by hueristically assuming 2.5 tokens per word - encoder = get_token_encoder() - num_input_tokens = len(encoder.encode(text)) - if num_input_tokens <= max_tokens: - return text - num_chars = len(text) - chars_per_token = num_chars / num_input_tokens - num_output_chars = int(chars_per_token * max_tokens) - clipped_text = text[:num_output_chars] - return clipped_text + try: + encoder = get_token_encoder() + num_input_tokens = len(encoder.encode(text)) + if num_input_tokens <= max_tokens: + return text + num_chars = len(text) + chars_per_token = num_chars / num_input_tokens + num_output_chars = int(chars_per_token * max_tokens) + clipped_text = text[:num_output_chars] + return clipped_text + except Exception as e: + logging.warning(f"Failed to clip tokens: {e}") + return text \ No newline at end of file From e24c5e3501aeaa01a0b78269421522853b9d1e2e Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 02:16:16 +0300 Subject: [PATCH 09/14] Update requirements.txt --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ea2cacdf..ebea2b71 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,4 +13,5 @@ atlassian-python-api==3.39.0 GitPython~=3.1.32 litellm~=0.1.351 PyYAML==6.0 -starlette-context==0.3.6 \ No newline at end of file +starlette-context==0.3.6 +litellm~=0.1.351 \ No newline at end of file From 3e542cd88bd8f965eea48614203feafe578afb2a Mon Sep 17 00:00:00 2001 From: Itamar Friedman Date: Thu, 10 Aug 2023 08:10:10 +0300 Subject: [PATCH 10/14] adding `permissions` to `review.yaml`, also adding some comments --- .github/workflows/review.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/review.yaml b/.github/workflows/review.yaml index e7612520..9dcf59b8 100644 --- a/.github/workflows/review.yaml +++ b/.github/workflows/review.yaml @@ -1,6 +1,17 @@ +# This workflow enables developers to call PR-Agents `/[actions]` in PR's comments and upon PR creation. +# Learn more at https://www.codium.ai/pr-agent/ +# This is v0.2 of this workflow file + +name: PR-Agent + on: pull_request: issue_comment: + +permissions: + issues: write + pull-requests: write + jobs: pr_agent_job: runs-on: ubuntu-latest From 4a47b78a902079d7adcf2e033d4b73015cc79323 Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 15:16:03 +0300 Subject: [PATCH 11/14] Rename workflow --- .github/workflows/{review.yaml => pr-agent-review.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{review.yaml => pr-agent-review.yaml} (100%) diff --git a/.github/workflows/review.yaml b/.github/workflows/pr-agent-review.yaml similarity index 100% rename from .github/workflows/review.yaml rename to .github/workflows/pr-agent-review.yaml From cf9c6a872d062317a33f1730c00657a10a5ef398 Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 16:09:29 +0300 Subject: [PATCH 12/14] Test github action --- .github/workflows/build-and-test.yaml | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/build-and-test.yaml diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml new file mode 100644 index 00000000..f71be1be --- /dev/null +++ b/.github/workflows/build-and-test.yaml @@ -0,0 +1,34 @@ +on: + push: + +jobs: + build-and-test: + runs-on: ubuntu-latest + + steps: + - id: checkout + uses: actions/checkout@v2 + + - id: dockerx + name: Setup Docker Buildx + uses: docker/setup-buildx-action@v2 + + - id: build + name: Build dev docker + uses: docker/build-push-action@v2 + with: + context: . + file: ./docker/Dockerfile + push: false + load: true + tags: codiumai/pr-agent:test + cache-from: type=gha,scope=dev + cache-to: type=gha,mode=max,scope=dev + target: test + + - id: test + name: Test dev docker + run: | + docker run --rm codiumai/pr-agent:test pytest -v + + From 2d6b94729287dc683f111d859eec70b2c3bbc550 Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 16:37:02 +0300 Subject: [PATCH 13/14] Test github action --- docker/Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4a8b86d5..61ab74cf 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -4,17 +4,21 @@ WORKDIR /app ADD pyproject.toml . RUN pip install . && rm pyproject.toml ENV PYTHONPATH=/app -ADD pr_agent pr_agent FROM base as github_app +ADD pr_agent pr_agent CMD ["python", "pr_agent/servers/github_app.py"] FROM base as github_polling +ADD pr_agent pr_agent CMD ["python", "pr_agent/servers/github_polling.py"] FROM base as test ADD requirements-dev.txt . RUN pip install -r requirements-dev.txt && rm requirements-dev.txt +ADD pr_agent pr_agent +ADD tests tests FROM base as cli +ADD pr_agent pr_agent ENTRYPOINT ["python", "pr_agent/cli.py"] From 20bbdac13584ca007287680d66f61fb3ae22b78c Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Thu, 10 Aug 2023 16:41:50 +0300 Subject: [PATCH 14/14] Test github action --- .github/workflows/build-and-test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index f71be1be..960da61b 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -1,3 +1,5 @@ +name: Build-and-test + on: push: