From ca922adc2e93b22f64b0705a9599c71df40edc2d Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Thu, 4 Sep 2025 11:45:21 -0400 Subject: [PATCH 01/13] add a dockerfile that can build the empty DB container Signed-off-by: Adrian Edwards --- docker/empty_database/Dockerfile | 66 ++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docker/empty_database/Dockerfile diff --git a/docker/empty_database/Dockerfile b/docker/empty_database/Dockerfile new file mode 100644 index 0000000000..d4e3122450 --- /dev/null +++ b/docker/empty_database/Dockerfile @@ -0,0 +1,66 @@ +from postgres:16 AS builder + +ENV DEBIAN_FRONTEND=noninteractive + +# Install uv (https://docs.astral.sh/uv/guides/integration/docker/#installing-uv) +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ +ENV UV_COMPILE_BYTECODE=1 +# The uv package cache will be on a cache volume, so can't be linked +ENV UV_LINK_MODE=copy +# Assert that the lockfile (uv.lock) is up-to-date. Use `uv lock` to update it +# manually if this fails the container build. +ENV UV_LOCKED=1 + +WORKDIR /augur + +COPY pyproject.toml . +COPY uv.lock . +COPY .python-version . + +# Install augur's dependencies early to take advantage of build cache +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --no-install-project --no-dev + +# Copy in the actual code +# The RUN line below ensure that permissions are set correctly. +# This is the equivalent of the following docker --chmod flags, but done in a way thats compatible with podman. +# This can be removed once https://github.com/containers/buildah/issues/6066 or relevant equivalent is fixed +# - u=rw,u+X: user can read and write all files/dirs and execute directories +# - go=r,go+X: group and others can read all files/dirs and execute directories +COPY README.md . +COPY LICENSE . +COPY alembic.ini . +COPY augur/ augur/ +COPY metadata.py . +COPY scripts/ scripts/ + +RUN find augur -type d -exec chmod u=rwx,go=rx {} + && find augur -type f -exec chmod u=rw,go=r {} + + +RUN find scripts -exec chmod u=rwx,go=rx {} + + +# Install the main project +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --no-dev + +# We aren't going to activate the virtualenv (manually or via uv run), so we +# need adjust the PATH +ENV PATH="/augur/.venv/bin:${PATH}" + +ENV POSTGRES_DB="augur" +ENV POSTGRES_USER="augur" +ENV POSTGRES_PASSWORD="augur" +ENV AUGUR_DB="postgresql+psycopg2://augur:augur@localhost:5432/augur" +# ENV PGDATA="/var/lib/postgresql/data" + +RUN set -e && \ + gosu postgres initdb && \ + gosu postgres pg_ctl -D "$PGDATA" -o "-c listen_addresses='localhost'" -w start && \ + gosu postgres psql -c "CREATE USER ${POSTGRES_USER} WITH SUPERUSER PASSWORD '${POSTGRES_PASSWORD}';" && \ + gosu postgres psql -c "CREATE DATABASE ${POSTGRES_DB} OWNER ${POSTGRES_USER};" && \ + augur db create-schema && \ + gosu postgres pg_ctl -D "$PGDATA" -m fast -w stop + + +FROM postgres:16 + +COPY --from=builder /var/lib/postgresql/data /var/lib/postgresql/data From 4631d9005f574040a248dc5f38e33e68e977a037 Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Thu, 4 Sep 2025 11:47:46 -0400 Subject: [PATCH 02/13] add empty db to GHCR container builds Signed-off-by: Adrian Edwards --- .github/workflows/build_docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml index d37d205da4..e7fa4b262c 100644 --- a/.github/workflows/build_docker.yml +++ b/.github/workflows/build_docker.yml @@ -300,6 +300,7 @@ jobs: - database - keyman - rabbitmq + - empty_database runs-on: ubuntu-latest steps: - name: Checkout repository From 33debfd1ba515c899608b29e6fb31bb2cd524c5c Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Mon, 15 Sep 2025 13:11:06 -0400 Subject: [PATCH 03/13] refactor send_messages to remove a almost entirely duplicate code path Signed-off-by: Adrian Edwards --- augur/tasks/util/collection_util.py | 62 ++++++++++++++--------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/augur/tasks/util/collection_util.py b/augur/tasks/util/collection_util.py index bed73bd120..44effbbf78 100644 --- a/augur/tasks/util/collection_util.py +++ b/augur/tasks/util/collection_util.py @@ -597,37 +597,33 @@ def send_messages(self): for repo_git, full_collection in col_hook.repo_list: repo = get_repo_by_repo_git(repo_git) + platform_name = "github" + # this needs to be here and not up a level since it should be set/reset for each repo. + # otherwise a gitlab repo would reset it and cause subsequent github repos to use gitlab phases. + phases = None if "github" in repo.repo_git: - augur_collection_sequence = [] - for job in col_hook.phases: - #Add the phase to the sequence in order as a celery task. - #The preliminary task creates the larger task chain - augur_collection_sequence.append(job(repo_git, full_collection)) - - #augur_collection_sequence.append(core_task_success_util.si(repo_git)) - #Link all phases in a chain and send to celery - augur_collection_chain = chain(*augur_collection_sequence) - task_id = augur_collection_chain.apply_async().task_id - - self.logger.info(f"Setting github repo {col_hook.name} status to collecting for repo: {repo_git}") - - #yield the value of the task_id to the calling method so that the proper collectionStatus field can be updated - yield repo_git, task_id, col_hook.name - else: - if col_hook.gitlab_phases is not None: - - augur_collection_sequence = [] - for job in col_hook.gitlab_phases: - #Add the phase to the sequence in order as a celery task. - #The preliminary task creates the larger task chain - augur_collection_sequence.append(job(repo_git, full_collection)) - - #augur_collection_sequence.append(core_task_success_util.si(repo_git)) - #Link all phases in a chain and send to celery - augur_collection_chain = chain(*augur_collection_sequence) - task_id = augur_collection_chain.apply_async().task_id - - self.logger.info(f"Setting gitlab repo {col_hook.name} status to collecting for repo: {repo_git}") - - #yield the value of the task_id to the calling method so that the proper collectionStatus field can be updated - yield repo_git, task_id, col_hook.name + phases = col_hook.phases + # use default platform name + + elif "gitlab" in repo.repo_git: + platform_name = "gitlab" + if col_hook.gitlab_phases is None: + return + phases = col_hook.gitlab_phases + + augur_collection_sequence = [] + for job in phases: + #Add the phase to the sequence in order as a celery task. + #The preliminary task creates the larger task chain + augur_collection_sequence.append(job(repo_git, full_collection)) + + #augur_collection_sequence.append(core_task_success_util.si(repo_git)) + #Link all phases in a chain and send to celery + augur_collection_chain = chain(*augur_collection_sequence) + task_id = augur_collection_chain.apply_async().task_id + + self.logger.info(f"Setting {platform_name} repo {col_hook.name} status to collecting for repo: {repo_git}") + + #yield the value of the task_id to the calling method so that the proper collectionStatus field can be updated + yield repo_git, task_id, col_hook.name + From 83d0db1c76d4837d1fde84750692595d3a15c4e1 Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Mon, 15 Sep 2025 16:37:03 -0400 Subject: [PATCH 04/13] refactor facade_phase to return the group itself so that celery can properly convert things into a chord Signed-off-by: Adrian Edwards --- augur/tasks/git/facade_tasks.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/augur/tasks/git/facade_tasks.py b/augur/tasks/git/facade_tasks.py index ce03524e0f..15537a4d1a 100644 --- a/augur/tasks/git/facade_tasks.py +++ b/augur/tasks/git/facade_tasks.py @@ -491,7 +491,6 @@ def facade_phase(repo_git, full_collection): #force_analysis = session.force_analysis run_facade_contributors = facade_helper.run_facade_contributors - facade_sequence = [] facade_core_collection = [] if not limited_run or (limited_run and pull_repos): @@ -509,14 +508,12 @@ def facade_phase(repo_git, full_collection): #These tasks need repos to be cloned by facade before they can work. - facade_sequence.append( - group( - chain(*facade_core_collection), - process_dependency_metrics.si(repo_git), - process_libyear_dependency_metrics.si(repo_git), - process_scc_value_metrics.si(repo_git) - ) + facade_sequence = group( + chain(*facade_core_collection), + process_dependency_metrics.si(repo_git), + process_libyear_dependency_metrics.si(repo_git), + process_scc_value_metrics.si(repo_git) ) logger.info(f"Facade sequence: {facade_sequence}") - return chain(*facade_sequence) \ No newline at end of file + return facade_sequence \ No newline at end of file From bc35b3802538656d451c0a4b6cdd017e1e550073 Mon Sep 17 00:00:00 2001 From: Sajal-Kulshreshtha Date: Tue, 9 Sep 2025 20:05:11 +0530 Subject: [PATCH 05/13] fix(cli): display timezone in output for GitHub key expiry (#3251) Signed-off-by: Sajal-Kulshreshtha --- augur/application/cli/github.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/augur/application/cli/github.py b/augur/application/cli/github.py index 4896bf05fb..bcc29597b6 100644 --- a/augur/application/cli/github.py +++ b/augur/application/cli/github.py @@ -88,9 +88,12 @@ def update_api_key(): engine.dispose() + + def epoch_to_local_time_with_am_pm(epoch): - local_time = datetime.fromtimestamp(epoch) - formatted_time = local_time.strftime('%I:%M %p') # This format includes the date as well + # Convert epoch to local time with timezone awareness + local_time = datetime.fromtimestamp(epoch).astimezone() + formatted_time = local_time.strftime('%Y-%m-%d %I:%M %p %Z (UTC%z)') return formatted_time From 60d3036d8d6b8b54d5f3668c892955fde60f190a Mon Sep 17 00:00:00 2001 From: Sajal-Kulshreshtha Date: Fri, 12 Sep 2025 03:15:36 +0530 Subject: [PATCH 06/13] removed day from formatted time Signed-off-by: Sajal-Kulshreshtha --- augur/application/cli/github.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/augur/application/cli/github.py b/augur/application/cli/github.py index bcc29597b6..6dfca0f7d5 100644 --- a/augur/application/cli/github.py +++ b/augur/application/cli/github.py @@ -93,7 +93,7 @@ def update_api_key(): def epoch_to_local_time_with_am_pm(epoch): # Convert epoch to local time with timezone awareness local_time = datetime.fromtimestamp(epoch).astimezone() - formatted_time = local_time.strftime('%Y-%m-%d %I:%M %p %Z (UTC%z)') + formatted_time = local_time.strftime('%I:%M %p %Z (UTC%z)') return formatted_time From 259869925d161c94881f921230d0d2f599596058 Mon Sep 17 00:00:00 2001 From: Sajal-Kulshreshtha Date: Tue, 16 Sep 2025 02:27:21 +0530 Subject: [PATCH 07/13] removed extra lines Signed-off-by: Sajal-Kulshreshtha --- augur/application/cli/github.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/augur/application/cli/github.py b/augur/application/cli/github.py index 6dfca0f7d5..8716a1f623 100644 --- a/augur/application/cli/github.py +++ b/augur/application/cli/github.py @@ -87,16 +87,12 @@ def update_api_key(): engine.dispose() - - - def epoch_to_local_time_with_am_pm(epoch): # Convert epoch to local time with timezone awareness local_time = datetime.fromtimestamp(epoch).astimezone() formatted_time = local_time.strftime('%I:%M %p %Z (UTC%z)') return formatted_time - def find_duplicates(lst): counter = Counter(lst) return [item for item, count in counter.items() if count > 1] From 139d5bcc326210ab3f61e6dd94e6cc7f45d1b556 Mon Sep 17 00:00:00 2001 From: Sajal-Kulshreshtha Date: Tue, 16 Sep 2025 20:25:51 +0530 Subject: [PATCH 08/13] Align timestamp formatting with header layout Signed-off-by: Sajal-Kulshreshtha --- augur/application/cli/github.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/augur/application/cli/github.py b/augur/application/cli/github.py index 8716a1f623..0fa1f2967c 100644 --- a/augur/application/cli/github.py +++ b/augur/application/cli/github.py @@ -56,7 +56,7 @@ def update_api_key(): core_reset_header = "Core Reset Time" graphql_request_header = "Graphql Requests Left" graphql_reset_header = "Graphql Reset Time" - print(f"{'Key'.center(40)} {core_request_header} {core_reset_header} {graphql_request_header} {graphql_reset_header}") + print(f"{'Key'.center(40)} {core_request_header} {core_reset_header.center(24)} {graphql_request_header} {graphql_reset_header.center(24)}") for key, core_key_data, graphql_key_data in valid_key_data: core_requests = str(core_key_data['requests_remaining']).center(len(core_request_header)) core_reset_time = str(epoch_to_local_time_with_am_pm(core_key_data["reset_epoch"])).center(len(core_reset_header)) @@ -90,7 +90,7 @@ def update_api_key(): def epoch_to_local_time_with_am_pm(epoch): # Convert epoch to local time with timezone awareness local_time = datetime.fromtimestamp(epoch).astimezone() - formatted_time = local_time.strftime('%I:%M %p %Z (UTC%z)') + formatted_time = local_time.strftime('%I:%M %p %Z (UTC%z)').center(24) return formatted_time def find_duplicates(lst): From db8843dacfec7dd251dafe88126ef42fc34bbc27 Mon Sep 17 00:00:00 2001 From: "Sean P. Goggins" Date: Tue, 23 Sep 2025 11:21:38 -0500 Subject: [PATCH 09/13] commented out abused API endpoint Signed-off-by: Sean P. Goggins --- augur/api/routes/contributor_reports.py | 536 ++++++++++++------------ 1 file changed, 274 insertions(+), 262 deletions(-) diff --git a/augur/api/routes/contributor_reports.py b/augur/api/routes/contributor_reports.py index 711f321b3e..a72e4478c6 100644 --- a/augur/api/routes/contributor_reports.py +++ b/augur/api/routes/contributor_reports.py @@ -39,283 +39,295 @@ def new_contributor_data_collection(repo_id, required_contributions): rank_list.append(num) rank_tuple = tuple(rank_list) - contributor_query = salc.sql.text(f""" +##### + +## Commented out due to abuse. + +##### + + + # contributor_query = salc.sql.text(f""" - SELECT * FROM ( - SELECT ID AS - cntrb_id, - A.created_at AS created_at, - date_part('month', A.created_at::DATE) AS month, - date_part('year', A.created_at::DATE) AS year, - A.repo_id, - repo_name, - full_name, - login, - ACTION, - rank() OVER ( - PARTITION BY id - ORDER BY A.created_at ASC - ) - FROM - ( - ( - SELECT - canonical_id AS ID, - created_at AS created_at, - repo_id, - 'issue_opened' AS ACTION, - contributors.cntrb_full_name AS full_name, - contributors.cntrb_login AS login - FROM - augur_data.issues - LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = issues.reporter_id - LEFT OUTER JOIN ( - SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, - cntrb_canonical AS canonical_email, - data_collection_date, - cntrb_id AS canonical_id - FROM augur_data.contributors - WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical - ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical - WHERE - repo_id = {repo_id} - AND pull_request IS NULL - GROUP BY - canonical_id, - repo_id, - issues.created_at, - contributors.cntrb_full_name, - contributors.cntrb_login - ) UNION ALL - ( - SELECT - canonical_id AS ID, - TO_TIMESTAMP( cmt_author_date, 'YYYY-MM-DD' ) AS created_at, - repo_id, - 'commit' AS ACTION, - contributors.cntrb_full_name AS full_name, - contributors.cntrb_login AS login - FROM - augur_data.commits - LEFT OUTER JOIN augur_data.contributors ON cntrb_email = cmt_author_email - LEFT OUTER JOIN ( - SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, - cntrb_canonical AS canonical_email, - data_collection_date, cntrb_id AS canonical_id - FROM augur_data.contributors - WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical - ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical - WHERE - repo_id = {repo_id} - GROUP BY - repo_id, - canonical_email, - canonical_id, - commits.cmt_author_date, - contributors.cntrb_full_name, - contributors.cntrb_login - ) UNION ALL - ( - SELECT - message.cntrb_id AS ID, - created_at AS created_at, - commits.repo_id, - 'commit_comment' AS ACTION, - contributors.cntrb_full_name AS full_name, - contributors.cntrb_login AS login + # SELECT * FROM ( + # SELECT ID AS + # cntrb_id, + # A.created_at AS created_at, + # date_part('month', A.created_at::DATE) AS month, + # date_part('year', A.created_at::DATE) AS year, + # A.repo_id, + # repo_name, + # full_name, + # login, + # ACTION, + # rank() OVER ( + # PARTITION BY id + # ORDER BY A.created_at ASC + # ) + # FROM + # ( + # ( + # SELECT + # canonical_id AS ID, + # created_at AS created_at, + # repo_id, + # 'issue_opened' AS ACTION, + # contributors.cntrb_full_name AS full_name, + # contributors.cntrb_login AS login + # FROM + # augur_data.issues + # LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = issues.reporter_id + # LEFT OUTER JOIN ( + # SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, + # cntrb_canonical AS canonical_email, + # data_collection_date, + # cntrb_id AS canonical_id + # FROM augur_data.contributors + # WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical + # ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical + # WHERE + # repo_id = {repo_id} + # AND pull_request IS NULL + # GROUP BY + # canonical_id, + # repo_id, + # issues.created_at, + # contributors.cntrb_full_name, + # contributors.cntrb_login + # ) UNION ALL + # ( + # SELECT + # canonical_id AS ID, + # TO_TIMESTAMP( cmt_author_date, 'YYYY-MM-DD' ) AS created_at, + # repo_id, + # 'commit' AS ACTION, + # contributors.cntrb_full_name AS full_name, + # contributors.cntrb_login AS login + # FROM + # augur_data.commits + # LEFT OUTER JOIN augur_data.contributors ON cntrb_email = cmt_author_email + # LEFT OUTER JOIN ( + # SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, + # cntrb_canonical AS canonical_email, + # data_collection_date, cntrb_id AS canonical_id + # FROM augur_data.contributors + # WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical + # ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical + # WHERE + # repo_id = {repo_id} + # GROUP BY + # repo_id, + # canonical_email, + # canonical_id, + # commits.cmt_author_date, + # contributors.cntrb_full_name, + # contributors.cntrb_login + # ) UNION ALL + # ( + # SELECT + # message.cntrb_id AS ID, + # created_at AS created_at, + # commits.repo_id, + # 'commit_comment' AS ACTION, + # contributors.cntrb_full_name AS full_name, + # contributors.cntrb_login AS login - FROM - augur_data.commit_comment_ref, - augur_data.commits, - augur_data.message - LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = message.cntrb_id - LEFT OUTER JOIN ( - SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, - cntrb_canonical AS canonical_email, - data_collection_date, cntrb_id AS canonical_id - FROM augur_data.contributors - WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical - ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical - WHERE - commits.cmt_id = commit_comment_ref.cmt_id - AND commits.repo_id = {repo_id} - AND commit_comment_ref.msg_id = message.msg_id + # FROM + # augur_data.commit_comment_ref, + # augur_data.commits, + # augur_data.message + # LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = message.cntrb_id + # LEFT OUTER JOIN ( + # SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, + # cntrb_canonical AS canonical_email, + # data_collection_date, cntrb_id AS canonical_id + # FROM augur_data.contributors + # WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical + # ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical + # WHERE + # commits.cmt_id = commit_comment_ref.cmt_id + # AND commits.repo_id = {repo_id} + # AND commit_comment_ref.msg_id = message.msg_id - GROUP BY - ID, - commits.repo_id, - commit_comment_ref.created_at, - contributors.cntrb_full_name, - contributors.cntrb_login - ) UNION ALL - ( - SELECT - issue_events.cntrb_id AS ID, - issue_events.created_at AS created_at, - issues.repo_id, - 'issue_closed' AS ACTION, - contributors.cntrb_full_name AS full_name, - contributors.cntrb_login AS login - FROM - augur_data.issues, - augur_data.issue_events - LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = issue_events.cntrb_id - LEFT OUTER JOIN ( - SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, - cntrb_canonical AS canonical_email, - data_collection_date, - cntrb_id AS canonical_id - FROM augur_data.contributors - WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical - ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical - WHERE - issues.repo_id = {repo_id} - AND issues.issue_id = issue_events.issue_id - AND issues.pull_request IS NULL - AND issue_events.cntrb_id IS NOT NULL - AND ACTION = 'closed' - GROUP BY - issue_events.cntrb_id, - issues.repo_id, - issue_events.created_at, - contributors.cntrb_full_name, - contributors.cntrb_login - ) UNION ALL - ( - SELECT - pr_augur_contributor_id AS ID, - pr_created_at AS created_at, - pull_requests.repo_id, - 'open_pull_request' AS ACTION, - contributors.cntrb_full_name AS full_name, - contributors.cntrb_login AS login - FROM - augur_data.pull_requests - LEFT OUTER JOIN augur_data.contributors ON pull_requests.pr_augur_contributor_id = contributors.cntrb_id - LEFT OUTER JOIN ( - SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, - cntrb_canonical AS canonical_email, - data_collection_date, - cntrb_id AS canonical_id - FROM augur_data.contributors - WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical - ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical - WHERE - pull_requests.repo_id = {repo_id} - GROUP BY - pull_requests.pr_augur_contributor_id, - pull_requests.repo_id, - pull_requests.pr_created_at, - contributors.cntrb_full_name, - contributors.cntrb_login - ) UNION ALL - ( - SELECT - message.cntrb_id AS ID, - msg_timestamp AS created_at, - pull_requests.repo_id as repo_id, - 'pull_request_comment' AS ACTION, - contributors.cntrb_full_name AS full_name, - contributors.cntrb_login AS login - FROM - augur_data.pull_requests, - augur_data.pull_request_message_ref, - augur_data.message - LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = message.cntrb_id - LEFT OUTER JOIN ( - SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, - cntrb_canonical AS canonical_email, - data_collection_date, - cntrb_id AS canonical_id - FROM augur_data.contributors - WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical - ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical - WHERE - pull_requests.repo_id = {repo_id} - AND pull_request_message_ref.pull_request_id = pull_requests.pull_request_id - AND pull_request_message_ref.msg_id = message.msg_id - GROUP BY - message.cntrb_id, - pull_requests.repo_id, - message.msg_timestamp, - contributors.cntrb_full_name, - contributors.cntrb_login - ) UNION ALL - ( - SELECT - issues.reporter_id AS ID, - msg_timestamp AS created_at, - issues.repo_id as repo_id, - 'issue_comment' AS ACTION, - contributors.cntrb_full_name AS full_name, - contributors.cntrb_login AS login - FROM - issues, - issue_message_ref, - message - LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = message.cntrb_id - LEFT OUTER JOIN ( - SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, - cntrb_canonical AS canonical_email, - data_collection_date, - cntrb_id AS canonical_id - FROM augur_data.contributors - WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical - ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical - WHERE - issues.repo_id = {repo_id} - AND issue_message_ref.msg_id = message.msg_id - AND issues.issue_id = issue_message_ref.issue_id - AND issues.pull_request_id = NULL - GROUP BY - issues.reporter_id, - issues.repo_id, - message.msg_timestamp, - contributors.cntrb_full_name, - contributors.cntrb_login - ) - ) A, - repo - WHERE - ID IS NOT NULL - AND A.repo_id = repo.repo_id - GROUP BY - A.ID, - A.repo_id, - A.ACTION, - A.created_at, - repo.repo_name, - A.full_name, - A.login - ORDER BY - cntrb_id - ) b - WHERE RANK IN {rank_tuple} - - """) + # GROUP BY + # ID, + # commits.repo_id, + # commit_comment_ref.created_at, + # contributors.cntrb_full_name, + # contributors.cntrb_login + # ) UNION ALL + # ( + # SELECT + # issue_events.cntrb_id AS ID, + # issue_events.created_at AS created_at, + # issues.repo_id, + # 'issue_closed' AS ACTION, + # contributors.cntrb_full_name AS full_name, + # contributors.cntrb_login AS login + # FROM + # augur_data.issues, + # augur_data.issue_events + # LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = issue_events.cntrb_id + # LEFT OUTER JOIN ( + # SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, + # cntrb_canonical AS canonical_email, + # data_collection_date, + # cntrb_id AS canonical_id + # FROM augur_data.contributors + # WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical + # ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical + # WHERE + # issues.repo_id = {repo_id} + # AND issues.issue_id = issue_events.issue_id + # AND issues.pull_request IS NULL + # AND issue_events.cntrb_id IS NOT NULL + # AND ACTION = 'closed' + # GROUP BY + # issue_events.cntrb_id, + # issues.repo_id, + # issue_events.created_at, + # contributors.cntrb_full_name, + # contributors.cntrb_login + # ) UNION ALL + # ( + # SELECT + # pr_augur_contributor_id AS ID, + # pr_created_at AS created_at, + # pull_requests.repo_id, + # 'open_pull_request' AS ACTION, + # contributors.cntrb_full_name AS full_name, + # contributors.cntrb_login AS login + # FROM + # augur_data.pull_requests + # LEFT OUTER JOIN augur_data.contributors ON pull_requests.pr_augur_contributor_id = contributors.cntrb_id + # LEFT OUTER JOIN ( + # SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, + # cntrb_canonical AS canonical_email, + # data_collection_date, + # cntrb_id AS canonical_id + # FROM augur_data.contributors + # WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical + # ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical + # WHERE + # pull_requests.repo_id = {repo_id} + # GROUP BY + # pull_requests.pr_augur_contributor_id, + # pull_requests.repo_id, + # pull_requests.pr_created_at, + # contributors.cntrb_full_name, + # contributors.cntrb_login + # ) UNION ALL + # ( + # SELECT + # message.cntrb_id AS ID, + # msg_timestamp AS created_at, + # pull_requests.repo_id as repo_id, + # 'pull_request_comment' AS ACTION, + # contributors.cntrb_full_name AS full_name, + # contributors.cntrb_login AS login + # FROM + # augur_data.pull_requests, + # augur_data.pull_request_message_ref, + # augur_data.message + # LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = message.cntrb_id + # LEFT OUTER JOIN ( + # SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, + # cntrb_canonical AS canonical_email, + # data_collection_date, + # cntrb_id AS canonical_id + # FROM augur_data.contributors + # WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical + # ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical + # WHERE + # pull_requests.repo_id = {repo_id} + # AND pull_request_message_ref.pull_request_id = pull_requests.pull_request_id + # AND pull_request_message_ref.msg_id = message.msg_id + # GROUP BY + # message.cntrb_id, + # pull_requests.repo_id, + # message.msg_timestamp, + # contributors.cntrb_full_name, + # contributors.cntrb_login + # ) UNION ALL + # ( + # SELECT + # issues.reporter_id AS ID, + # msg_timestamp AS created_at, + # issues.repo_id as repo_id, + # 'issue_comment' AS ACTION, + # contributors.cntrb_full_name AS full_name, + # contributors.cntrb_login AS login + # FROM + # issues, + # issue_message_ref, + # message + # LEFT OUTER JOIN augur_data.contributors ON contributors.cntrb_id = message.cntrb_id + # LEFT OUTER JOIN ( + # SELECT DISTINCT ON ( cntrb_canonical ) cntrb_full_name, + # cntrb_canonical AS canonical_email, + # data_collection_date, + # cntrb_id AS canonical_id + # FROM augur_data.contributors + # WHERE cntrb_canonical = cntrb_email ORDER BY cntrb_canonical + # ) canonical_full_names ON canonical_full_names.canonical_email =contributors.cntrb_canonical + # WHERE + # issues.repo_id = {repo_id} + # AND issue_message_ref.msg_id = message.msg_id + # AND issues.issue_id = issue_message_ref.issue_id + # AND issues.pull_request_id = NULL + # GROUP BY + # issues.reporter_id, + # issues.repo_id, + # message.msg_timestamp, + # contributors.cntrb_full_name, + # contributors.cntrb_login + # ) + # ) A, + # repo + # WHERE + # ID IS NOT NULL + # AND A.repo_id = repo.repo_id + # GROUP BY + # A.ID, + # A.repo_id, + # A.ACTION, + # A.created_at, + # repo.repo_name, + # A.full_name, + # A.login + # ORDER BY + # cntrb_id + # ) b + # WHERE RANK IN {rank_tuple} + + # """) + # contributor_query2 = (""" + + # select count(*) from augur_data.repo; + # """) with current_app.engine.connect() as conn: - df = pd.read_sql(contributor_query, conn) + df = pd.read_sql(contributor_query2, conn) - df = df.loc[~df['full_name'].str.contains('bot', na=False)] - df = df.loc[~df['login'].str.contains('bot', na=False)] + #df = df.loc[~df['full_name'].str.contains('bot', na=False)] + #df = df.loc[~df['login'].str.contains('bot', na=False)] - df = df.loc[~df['cntrb_id'].isin(df[df.duplicated(['cntrb_id', 'created_at', 'repo_id', 'rank'])]['cntrb_id'])] + #df = df.loc[~df['cntrb_id'].isin(df[df.duplicated(['cntrb_id', 'created_at', 'repo_id', 'rank'])]['cntrb_id'])] # add yearmonths to contributor - df[['month', 'year']] = df[['month', 'year']].astype(int).astype(str) - df['yearmonth'] = df['month'] + '/' + df['year'] - df['yearmonth'] = pd.to_datetime(df['yearmonth']) + #df[['month', 'year']] = df[['month', 'year']].astype(int).astype(str) + #df['yearmonth'] = df['month'] + '/' + df['year'] + #df['yearmonth'] = pd.to_datetime(df['yearmonth']) # add column with every value being one, so when the contributor df is concatenated # with the months df, the filler months won't be counted in the sums - df['new_contributors'] = 1 + #df['new_contributors'] = 1 # add quarters to contributor dataframe - df['month'] = df['month'].astype(int) - df['quarter'] = df.apply(lambda x: quarters(x['month'], x['year']), axis=1, result_type='reduce') - df['quarter'] = pd.to_datetime(df['quarter']) + #df['month'] = df['month'].astype(int) + #df['quarter'] = df.apply(lambda x: quarters(x['month'], x['year']), axis=1, result_type='reduce') + #df['quarter'] = pd.to_datetime(df['quarter']) + df = [1] return df def months_data_collection(start_date, end_date): From 5899e01112c18cd6880fd3a1f1a70d303fca1c0e Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Tue, 23 Sep 2025 13:04:52 -0400 Subject: [PATCH 10/13] bump celery and a related dependency Signed-off-by: Adrian Edwards --- pyproject.toml | 4 ++-- uv.lock | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6e78b2118f..c086babe25 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,8 +25,8 @@ dependencies = [ "bokeh==2.0.2", "boto3==1.17.57", "bs4==0.0.1", - "celery==5.2.7", - "click==8.0.3", + "celery~=5.5", + "click~=8.1", "cloudpickle>=0.2.2", "coloredlogs==15.0", "dask>=2021.6.2", diff --git a/uv.lock b/uv.lock index 66352a8f2e..1c74a61de7 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.12'", @@ -244,8 +244,8 @@ requires-dist = [ { name = "bokeh", specifier = "==2.0.2" }, { name = "boto3", specifier = "==1.17.57" }, { name = "bs4", specifier = "==0.0.1" }, - { name = "celery", specifier = "==5.2.7" }, - { name = "click", specifier = "==8.0.3" }, + { name = "celery", specifier = "~=5.5" }, + { name = "click", specifier = "~=8.1" }, { name = "cloudpickle", specifier = ">=0.2.2" }, { name = "coloredlogs", specifier = "==15.0" }, { name = "dask", specifier = ">=2021.6.2" }, @@ -364,11 +364,11 @@ wheels = [ [[package]] name = "billiard" -version = "3.6.4.0" +version = "4.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/91/40de1901da8ec9eeb7c6a22143ba5d55d8aaa790761ca31342cedcd5c793/billiard-3.6.4.0.tar.gz", hash = "sha256:299de5a8da28a783d51b197d496bef4f1595dd023a93a4f59dde1886ae905547", size = 155303, upload-time = "2021-04-01T09:23:50.092Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/6a/1405343016bce8354b29d90aad6b0bf6485b5e60404516e4b9a3a9646cf0/billiard-4.2.2.tar.gz", hash = "sha256:e815017a062b714958463e07ba15981d802dc53d41c5b69d28c5a7c238f8ecf3", size = 155592, upload-time = "2025-09-20T14:44:40.456Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/89/0c43de91d4e52eaa7bd748771d417f6ac9e51e66b2f61928c2151bf65878/billiard-3.6.4.0-py3-none-any.whl", hash = "sha256:87103ea78fa6ab4d5c751c4909bcff74617d985de7fa8b672cf8618afd5a875b", size = 89472, upload-time = "2021-04-01T09:23:42.019Z" }, + { url = "https://files.pythonhosted.org/packages/a6/80/ef8dff49aae0e4430f81842f7403e14e0ca59db7bbaf7af41245b67c6b25/billiard-4.2.2-py3-none-any.whl", hash = "sha256:4bc05dcf0d1cc6addef470723aac2a6232f3c7ed7475b0b580473a9145829457", size = 86896, upload-time = "2025-09-20T14:44:39.157Z" }, ] [[package]] @@ -441,7 +441,7 @@ wheels = [ [[package]] name = "celery" -version = "5.2.7" +version = "5.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "billiard" }, @@ -450,12 +450,12 @@ dependencies = [ { name = "click-plugins" }, { name = "click-repl" }, { name = "kombu" }, - { name = "pytz" }, + { name = "python-dateutil" }, { name = "vine" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/21/41a0028f6d610987c0839250357c1a00f351790b8a448c2eb323caa719ac/celery-5.2.7.tar.gz", hash = "sha256:fafbd82934d30f8a004f81e8f7a062e31413a23d444be8ee3326553915958c6d", size = 1474243, upload-time = "2022-05-29T12:58:03.046Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/7d/6c289f407d219ba36d8b384b42489ebdd0c84ce9c413875a8aae0c85f35b/celery-5.5.3.tar.gz", hash = "sha256:6c972ae7968c2b5281227f01c3a3f984037d21c5129d07bf3550cc2afc6b10a5", size = 1667144, upload-time = "2025-06-01T11:08:12.563Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/99/21fe9d1829cab4fc77d18f89d0c4cbcfe754e95f8b8f4af64fe4997c442f/celery-5.2.7-py3-none-any.whl", hash = "sha256:138420c020cd58d6707e6257b6beda91fd39af7afde5d36c6334d175302c0e14", size = 405637, upload-time = "2022-05-29T12:57:59.911Z" }, + { url = "https://files.pythonhosted.org/packages/c9/af/0dcccc7fdcdf170f9a1585e5e96b6fb0ba1749ef6be8c89a6202284759bd/celery-5.5.3-py3-none-any.whl", hash = "sha256:0b5761a07057acee94694464ca482416b959568904c9dfa41ce8413a7d65d525", size = 438775, upload-time = "2025-06-01T11:08:09.94Z" }, ] [[package]] @@ -530,14 +530,14 @@ wheels = [ [[package]] name = "click" -version = "8.0.3" +version = "8.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/09/ad003f1e3428017d1c3da4ccc9547591703ffea548626f47ec74509c5824/click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b", size = 329034, upload-time = "2021-10-10T18:07:33.001Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/58/c8aa6a8e62cc75f39fee1092c45d6b6ba684122697d7ce7d53f64f98a129/click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", size = 97516, upload-time = "2021-10-10T18:07:30.752Z" }, + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, ] [[package]] From 493ddddfc2d063a2e2743281a2bb20889cba07a5 Mon Sep 17 00:00:00 2001 From: "Sean P. Goggins" Date: Tue, 23 Sep 2025 17:46:03 -0500 Subject: [PATCH 11/13] updated Signed-off-by: Sean P. Goggins --- augur/api/routes/contributor_reports.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/augur/api/routes/contributor_reports.py b/augur/api/routes/contributor_reports.py index a72e4478c6..6c107ed603 100644 --- a/augur/api/routes/contributor_reports.py +++ b/augur/api/routes/contributor_reports.py @@ -305,8 +305,8 @@ def new_contributor_data_collection(repo_id, required_contributions): # select count(*) from augur_data.repo; # """) - with current_app.engine.connect() as conn: - df = pd.read_sql(contributor_query2, conn) + #with current_app.engine.connect() as conn: + # df = pd.read_sql(contributor_query2, conn) #df = df.loc[~df['full_name'].str.contains('bot', na=False)] #df = df.loc[~df['login'].str.contains('bot', na=False)] From bcd58f56b4df646804accff4f0c7f516d138879b Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Tue, 23 Sep 2025 18:46:19 -0400 Subject: [PATCH 12/13] Revert "Merge pull request #3271 from MoralCode/collection_util-duplicate-code" This reverts commit c8f22bba099e7538b102edda26369092b2c4fd23, reversing changes made to fefb48a171001a032ccd55a8706befb045f35c91. --- augur/tasks/util/collection_util.py | 62 +++++++++++++++-------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/augur/tasks/util/collection_util.py b/augur/tasks/util/collection_util.py index 44effbbf78..bed73bd120 100644 --- a/augur/tasks/util/collection_util.py +++ b/augur/tasks/util/collection_util.py @@ -597,33 +597,37 @@ def send_messages(self): for repo_git, full_collection in col_hook.repo_list: repo = get_repo_by_repo_git(repo_git) - platform_name = "github" - # this needs to be here and not up a level since it should be set/reset for each repo. - # otherwise a gitlab repo would reset it and cause subsequent github repos to use gitlab phases. - phases = None if "github" in repo.repo_git: - phases = col_hook.phases - # use default platform name - - elif "gitlab" in repo.repo_git: - platform_name = "gitlab" - if col_hook.gitlab_phases is None: - return - phases = col_hook.gitlab_phases - - augur_collection_sequence = [] - for job in phases: - #Add the phase to the sequence in order as a celery task. - #The preliminary task creates the larger task chain - augur_collection_sequence.append(job(repo_git, full_collection)) - - #augur_collection_sequence.append(core_task_success_util.si(repo_git)) - #Link all phases in a chain and send to celery - augur_collection_chain = chain(*augur_collection_sequence) - task_id = augur_collection_chain.apply_async().task_id - - self.logger.info(f"Setting {platform_name} repo {col_hook.name} status to collecting for repo: {repo_git}") - - #yield the value of the task_id to the calling method so that the proper collectionStatus field can be updated - yield repo_git, task_id, col_hook.name - + augur_collection_sequence = [] + for job in col_hook.phases: + #Add the phase to the sequence in order as a celery task. + #The preliminary task creates the larger task chain + augur_collection_sequence.append(job(repo_git, full_collection)) + + #augur_collection_sequence.append(core_task_success_util.si(repo_git)) + #Link all phases in a chain and send to celery + augur_collection_chain = chain(*augur_collection_sequence) + task_id = augur_collection_chain.apply_async().task_id + + self.logger.info(f"Setting github repo {col_hook.name} status to collecting for repo: {repo_git}") + + #yield the value of the task_id to the calling method so that the proper collectionStatus field can be updated + yield repo_git, task_id, col_hook.name + else: + if col_hook.gitlab_phases is not None: + + augur_collection_sequence = [] + for job in col_hook.gitlab_phases: + #Add the phase to the sequence in order as a celery task. + #The preliminary task creates the larger task chain + augur_collection_sequence.append(job(repo_git, full_collection)) + + #augur_collection_sequence.append(core_task_success_util.si(repo_git)) + #Link all phases in a chain and send to celery + augur_collection_chain = chain(*augur_collection_sequence) + task_id = augur_collection_chain.apply_async().task_id + + self.logger.info(f"Setting gitlab repo {col_hook.name} status to collecting for repo: {repo_git}") + + #yield the value of the task_id to the calling method so that the proper collectionStatus field can be updated + yield repo_git, task_id, col_hook.name From b0bb3b80402ee5fcd84bec7334e58a41f9f5ec8a Mon Sep 17 00:00:00 2001 From: "Sean P. Goggins" Date: Tue, 23 Sep 2025 17:56:25 -0500 Subject: [PATCH 13/13] updated metadata for new version Signed-off-by: Sean P. Goggins --- README.md | 4 ++-- docker/backend/Dockerfile | 2 +- docker/database/Dockerfile | 2 +- docker/keyman/Dockerfile | 2 +- metadata.py | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9c7acddc65..bac449c3d8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Augur NEW Release v0.90.0 +# Augur NEW Release v0.90.3 Augur is primarily a data engineering tool that makes it possible for data scientists to gather open source software community data - less data carpentry for everyone else! The primary way of looking at Augur data is through [8Knot](https://github.com/oss-aspen/8knot), a public instance of 8Knot is available [here](https://metrix.chaoss.io) - this is tied to a public instance of [Augur](https://ai.chaoss.io). @@ -11,7 +11,7 @@ We follow the [First Timers Only](https://www.firsttimersonly.com/) philosophy o ## NEW RELEASE ALERT! **If you want to jump right in, the updated docker, docker-compose and bare metal installation instructions are available [here](docs/new-install.md)**. -Augur is now releasing a dramatically improved new version. It is also available [here](https://github.com/chaoss/augur/releases/tag/v0.90.0). +Augur is now releasing a dramatically improved new version. It is also available [here](https://github.com/chaoss/augur/releases/tag/v0.90.3). - The `release` branch is a stable version of our new architecture, which features: diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index e627dc6681..0a05daf848 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -20,7 +20,7 @@ RUN go install github.com/ossf/scorecard/v5@v5.1.1 \ FROM python:3.11-slim-bullseye LABEL maintainer="outdoors@acm.org" -LABEL version="0.90.0" +LABEL version="0.90.3" ENV DEBIAN_FRONTEND=noninteractive ENV PATH="/usr/bin/:/usr/local/bin:/usr/lib:${PATH}" diff --git a/docker/database/Dockerfile b/docker/database/Dockerfile index 50e7653af2..6558fe44ec 100644 --- a/docker/database/Dockerfile +++ b/docker/database/Dockerfile @@ -2,7 +2,7 @@ FROM postgres:16 LABEL maintainer="outdoors@acm.org" -LABEL version="0.90.0" +LABEL version="0.90.3" ENV POSTGRES_DB="test" ENV POSTGRES_USER="augur" diff --git a/docker/keyman/Dockerfile b/docker/keyman/Dockerfile index ed77ef18d4..72c46ba225 100644 --- a/docker/keyman/Dockerfile +++ b/docker/keyman/Dockerfile @@ -1,7 +1,7 @@ FROM python:3.11.12-alpine LABEL maintainer="outdoors@acm.org" -LABEL version="0.90.0" +LABEL version="0.90.3" RUN pip install --no-cache-dir --upgrade pip diff --git a/metadata.py b/metadata.py index da181f6526..bc38e3fe34 100644 --- a/metadata.py +++ b/metadata.py @@ -5,8 +5,8 @@ __short_description__ = "Python 3 package for free/libre and open-source software community metrics, models & data collection" -__version__ = "0.90.0" -__release__ = "v0.90.0 (Trade Deadline)" +__version__ = "0.90.3" +__release__ = "v0.90.3 (Trade Deadline)" __license__ = "MIT" __copyright__ = "University of Missouri, University of Nebraska-Omaha, CHAOSS, Sean Goggins, Brian Warner & Augurlabs 2025, Red Hat Software"