Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • gajim/gajim
  • lovetox/gajim
  • ag/gajim
  • linkmauve/gajim
  • asterix/gajim
  • andre/gajim
  • mimi89999/gajim
  • bronko/gajim
  • wurstsalat/gajim
  • baitisj/gajim
  • Dicson/gajim
  • PolynomialDivision/gajim
  • troom/gajim
  • sophie-h/gajim
  • marmistrz/gajim
  • mrDoctorWho/gajim
  • orhideous/gajim
  • jjrh/gajim
  • streaps/gajim
  • jhuffine/gajim
  • maltel/gajim
  • Dominion/gajim
  • norstbox/gajim
  • synchrone/gajim
  • mick3247652/gajim
  • Yuki/gajim
  • l-n-s/gajim
  • ehuelsmann/gajim
  • hrxi/gajim
  • SaltyBones/gajim
  • rlgh/gajim
  • genofire/gajim
  • weblate/gajim
  • PapaTutuWawa/gajim
  • eta/gajim
  • jelmer/gajim
  • Ge0rG/gajim
  • TSRh/gajim
  • tolosaeduard/gajim
  • pitchum/gajim
  • mexicarne/gajim
  • prmcgs/gajim
  • mehw/gajim
  • ecxod/gajim
  • wannestas/gajim
  • XutaxKamay/gajim
  • emil/gajim-fork
  • gs/gajim
  • jurajlutter/gajim
  • Sheldon/gajim-cme
  • dexgs/gajim
  • bodqhrohro/gajim
  • Ermine/gajim
  • mesonium/gajim
  • mjk/gajim
  • nicoco/gajim
  • Polarian/gajim
  • izaya/gajim
  • kurion/gajim
  • npmania/gajim
  • ebertus/gajim
  • intelfx/gajim
  • musipusi/gajim
  • wusspuss/gajim
  • slicht/gajim
  • toms/gajim
  • singpolyma/gajim
  • Antiz/gajim
  • hendursaga/gajim
  • cve-1312/gajim
  • smemes2/gajim
  • amlor/gajim
72 results
Show changes
Commits on Source (2445)
Showing
with 2456 additions and 646 deletions
{{ if .Versions -}}
<a name="unreleased"></a>
## [Unreleased]
{{ if .Unreleased.CommitGroups -}}
{{ range .Unreleased.CommitGroups -}}
{{ .Title }}
{{ range .Commits -}}
* {{if .Refs}}{{range .Refs}}#{{.Ref}} {{end}}{{end}}{{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}
{{ range .Versions }}
<a name="{{ .Tag.Name }}"></a>
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {{ datetime "2006-01-02" .Tag.Date }}
Gajim {{ .Tag.Name }} ({{ datetime "02 Jan 2006" .Tag.Date }})
{{ range .CommitGroups -}}
{{ .Title }}
{{ if .Title }} {{ .Title }}{{end}}
{{ range .Commits -}}
* {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ if .Subject }} * {{ .Subject }}{{end}}{{if .Refs}} ({{range .Refs}}#{{.Ref}}{{end}}){{end}}
{{ end }}
{{ end -}}
......@@ -32,13 +17,7 @@ ## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}
{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
{{ end -}}
{{break}}
{{ end -}}
{{ end -}}
\ No newline at end of file
......@@ -8,19 +8,22 @@ options:
filters:
Type:
- feat
- imprv
- change
- perf
- fix
- imprv
commit_groups:
sort_by: Custom
title_order:
- feat
- imprv
- change
- perf
- fix
title_maps:
feat: New
imprv: Improvements
change: Change
perf: Performance
fix: Bug Fixes
header:
......@@ -34,3 +37,6 @@ options:
refs:
actions:
- Fixes
notes:
keywords:
- NOTES
......@@ -3,20 +3,10 @@ version: 1.1.{build}
image: Visual Studio 2019
environment:
# matrix:
MSYSTEM: MINGW64
MSYS_ARCH: "x86_64"
ARCH: "64bit"
MSYSTEM: MINGW64
ARCH: "64bit"
# - MSYSTEM: MINGW32
# MSYS_ARCH: "i686"
# ARCH: "32bit"
branches:
only:
- master
clone_depth: 1
clone_depth: 10
# init:
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
......@@ -30,10 +20,10 @@ install:
- bash -lc "pacman --needed --noconfirm -Su"
build_script:
- ps: |
$filename = "Gajim-$($env:GAJIM_VERSION)-$($env:ARCH)"
$filename_portable = "Gajim-Portable-$($env:GAJIM_VERSION)-$($env:ARCH)"
$filename_msixbundle = "Gajim-$($env:GAJIM_VERSION)"
if ($env:GAJIM_VERSION -eq "Nightly") {
$time_string=(get-date -UFormat "%Y-%m-%d").ToString()
......@@ -48,10 +38,14 @@ build_script:
C:\msys64\usr\bin\sh.exe --login -c $command
}
bash "git clone C:/projects/gajim C:/msys64/home/appveyor/gajim"
bash "C:/msys64/home/appveyor/gajim/win/build.sh $($env:MSYS_ARCH)"
git clone "$env:APPVEYOR_BUILD_FOLDER" "C:\msys64\home\appveyor\gajim"
bash "C:/msys64/home/appveyor/gajim/win/build.sh"
if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
Push-AppveyorArtifact "$($buildroot)/Gajim.exe" -FileName "$($filename).exe"
Push-AppveyorArtifact "$($buildroot)/Gajim-Portable.exe" -FileName "$($filename_portable).exe"
Push-AppveyorArtifact "$($buildroot)/Gajim.msixbundle" -FileName "$($filename_msixbundle).msixbundle"
if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
# on_finish:
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
#!/usr/bin/env python3
import os
import requests
import time
from pathlib import Path
from rich.console import Console
ACCOUNT = 'lovetox'
PROJECT_SLUG = 'gajim'
BRANCH = 'master'
BASE_URL = 'https://ci.appveyor.com/api'
API_KEY = os.environ['APPVEYOR_API_KEY']
HEADERS = {'Authorization': f'Bearer {API_KEY}'}
RETRY_TIMEOUT = 2 * 60
INITIAL_START_DELAY = 20 * 60
SETTINGS_API_URL = f'{BASE_URL}/projects/{ACCOUNT}/{PROJECT_SLUG}/settings/yaml'
BUILDS_API_URL = f'{BASE_URL}/builds'
PROJECT_API_URL = f'{BASE_URL}/projects/{ACCOUNT}/{PROJECT_SLUG}'
console = Console()
def get_gajim_version() -> str:
if os.environ.get('GAJIM_NIGHTLY_BUILD') is not None:
return 'Nightly'
tag = os.environ.get('CI_COMMIT_TAG')
if tag is None:
exit('No tag found')
return tag
def push_yaml_to_project() -> None:
console.print('Push settings ...')
with open('.ci/appveyor.yml', 'r') as file:
yaml = file.read()
req = requests.put(SETTINGS_API_URL, data=yaml, headers=HEADERS)
req.raise_for_status()
def start_build() -> str:
console.print('Start build ...')
payload = {
'accountName': ACCOUNT,
'projectSlug': PROJECT_SLUG,
'branch': BRANCH,
'commitId': os.environ['CI_COMMIT_SHA'],
'environmentVariables': {
'GAJIM_VERSION': get_gajim_version(),
}
}
req = requests.post(BUILDS_API_URL, headers=HEADERS, json=payload)
req.raise_for_status()
response = req.json()
return response['buildId']
def is_build_finished(build: dict[str, str]) -> bool:
if build['status'] in ('failed', 'cancelled'):
exit('Found failed job')
return build['status'] == 'success'
def get_artifacts(build_id: str) -> None:
time.sleep(INITIAL_START_DELAY)
while True:
time.sleep(RETRY_TIMEOUT)
console.print('Check build status ...')
req = requests.get(PROJECT_API_URL, headers=HEADERS)
req.raise_for_status()
response = req.json()
build = response['build']
if build_id != build['buildId']:
exit('Unable to find buildid: %s' % build_id)
if is_build_finished(build):
break
console.print('Build status:', build['status'])
build_folder = Path.cwd() / 'build'
build_folder.mkdir()
for job in build['jobs']:
download_job_artifacts(job['jobId'], build_folder)
console.print('All artifacts downloaded!')
def download_job_artifacts(job_id: str, target_folder: Path) -> None:
artifacts_api_url = f'{BASE_URL}/buildjobs/{job_id}/artifacts'
req = requests.get(artifacts_api_url, headers=HEADERS)
req.raise_for_status()
response = req.json()
for artifact in response:
filename = artifact['fileName']
console.print('Download', filename, '...')
file_url = f'{artifacts_api_url}/{filename}'
req = requests.get(file_url, headers=HEADERS)
req.raise_for_status()
with open(target_folder / filename, 'wb') as file:
file.write(req.content)
if __name__ == '__main__':
push_yaml_to_project()
build_id = start_build()
get_artifacts(build_id)
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import dataclasses
import logging
import shutil
import subprocess
from datetime import datetime
from datetime import timezone
from pathlib import Path
LOG_FORMAT = '%(asctime)s %(levelname)s %(message)s'
logging.basicConfig(format=LOG_FORMAT, level=logging.DEBUG)
log = logging.getLogger()
ROOT_DIR = Path(__file__).resolve().parent.parent
BUILD_DIR = ROOT_DIR / 'debian_build'
DATE = datetime.now().strftime('%Y%m%d')
DATE_TIME = datetime.now(tz=timezone.utc).strftime('%a, %d %b %Y %T %z')
@dataclasses.dataclass
class ReleaseContext:
app: str
pkg_name: str
rev: str
release_name: str
release_dir: Path
tarball: Path
@classmethod
def from_tarball(cls, path: str, prefix: str, rev: str) -> ReleaseContext:
tarball = Path(path)
app = tarball.name.split('-', maxsplit=1)[0]
pkg_name = f'{prefix}{app}-nightly'
release_name = f'{pkg_name}_{DATE}'
release_dir = BUILD_DIR / release_name
return cls(app=app,
pkg_name=pkg_name,
rev=rev,
release_name=release_name,
release_dir=release_dir,
tarball=tarball)
def clean_build_dir() -> None:
log.info('Cleanup build directory')
if BUILD_DIR.exists():
shutil.rmtree(BUILD_DIR)
BUILD_DIR.mkdir()
def prepare_package_dir(context: ReleaseContext) -> None:
log.info('Extract tarball')
tarball = Path(shutil.copy(context.tarball, BUILD_DIR))
tarball = tarball.rename(BUILD_DIR / f'{context.release_name}.orig.tar.gz')
shutil.unpack_archive(tarball, BUILD_DIR)
log.info('Rename dir to: %s', context.release_name)
folder = list(BUILD_DIR.glob(f'{context.app}-?.?.?'))[0]
folder = folder.rename(context.release_dir)
log.info('Copy debian folder into release directory')
shutil.copytree(ROOT_DIR / 'debian', context.release_dir / 'debian')
def prepare_changelog(context: ReleaseContext) -> None:
log.info('Prepare Changelog')
changelog = context.release_dir / 'debian' / 'changelog'
content = changelog.read_text()
content = content.replace('{DATE}', f'{DATE}-{context.rev}')
content = content.replace('{DATE_TIME}', DATE_TIME)
changelog.write_text(content)
def build(context: ReleaseContext) -> None:
log.info('Start package build')
subprocess.run(
[
'dpkg-buildpackage',
'--no-sign'
],
cwd=context.release_dir,
check=True)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Build debian package')
parser.add_argument('tarball', help='Path to tarball e.g. app.tar.gz')
parser.add_argument('rev', help='The package revision e.g. 1')
parser.add_argument('--pkgprefix', default='', required=False,
help='Prefix for the package name e.g. python3-')
args = parser.parse_args()
context = ReleaseContext.from_tarball(args.tarball,
args.pkgprefix,
args.rev)
clean_build_dir()
prepare_package_dir(context)
prepare_changelog(context)
build(context)
from typing import Any
from typing import Optional
import functools
import os
import sys
from datetime import date
from ftplib import FTP_TLS
from pathlib import Path
from rich.console import Console
FTP_URL = 'panoramix.gajim.org'
FTP_USER = os.environ['FTP_USER']
FTP_PASS = os.environ['FTP_PASS']
WINDOWS_NIGHTLY_FOLDER = 'downloads/snap/win'
LINUX_NIGHTLY_FOLDER = 'downloads/snap'
RELEASE_FOLDER_BASE = 'downloads'
console = Console()
def ftp_connection(func: Any) -> Any:
@functools.wraps(func)
def func_wrapper(filedir: Path) -> None:
ftp = FTP_TLS(FTP_URL, FTP_USER, FTP_PASS)
console.print('Successfully connected to', FTP_URL)
func(ftp, filedir)
ftp.quit()
console.print('Quit')
return
return func_wrapper
def get_release_folder_from_tag(tag: str) -> str:
numbers = tag.split('.')
return '.'.join(numbers[:2])
def get_gajim_tag() -> str:
tag = os.environ.get('CI_COMMIT_TAG')
if tag is None:
exit('No tag found')
return tag
def find_linux_tarball(filedir: Path) -> Path:
files = list(filedir.glob('gajim-*.tar.gz'))
if len(files) != 1:
exit('Unknown files found')
return files[0]
def get_dir_list(ftp: FTP_TLS) -> list[str]:
return [x[0] for x in ftp.mlsd()]
def create_release_folder(ftp: FTP_TLS, tag: str) -> None:
ftp.cwd(RELEASE_FOLDER_BASE)
folder = get_release_folder_from_tag(tag)
dir_list = get_dir_list(ftp)
if folder not in dir_list:
ftp.mkd(folder)
ftp.cwd(folder)
def upload_all_from_dir(ftp: FTP_TLS, filedir: Path) -> None:
for filepath in filedir.iterdir():
upload_file(ftp, filepath)
def upload_file(ftp: FTP_TLS,
filepath: Path,
name: Optional[str] = None) -> None:
if name is None:
name = filepath.name
console.print('Upload file', filepath.name, 'as', name)
with open(filepath, 'rb') as f:
ftp.storbinary('STOR ' + name, f)
def get_deploy_method() -> str:
deploy_type = os.environ['DEPLOY_TYPE']
is_nightly = bool(os.environ.get('GAJIM_NIGHTLY_BUILD'))
if is_nightly:
return f'deploy_{deploy_type}_nightly'
return f'deploy_{deploy_type}_release'
@ftp_connection
def deploy_windows_nightly(ftp: FTP_TLS, filedir: Path) -> None:
ftp.cwd(WINDOWS_NIGHTLY_FOLDER)
upload_all_from_dir(ftp, filedir)
@ftp_connection
def deploy_windows_release(ftp: FTP_TLS, filedir: Path) -> None:
tag = get_gajim_tag()
create_release_folder(ftp, tag)
upload_all_from_dir(ftp, filedir)
@ftp_connection
def deploy_linux_nightly(ftp: FTP_TLS, filedir: Path) -> None:
ftp.cwd(LINUX_NIGHTLY_FOLDER)
filepath = find_linux_tarball(filedir)
filename = f'gajim-{date.today().isoformat()}.tar.gz'
upload_file(ftp, filepath, name=filename)
@ftp_connection
def deploy_linux_release(ftp: FTP_TLS, file: Path) -> None:
tag = get_gajim_tag()
create_release_folder(ftp, tag)
filepath = find_linux_tarball(filedir)
filename = f'gajim-{tag}.tar.gz'
upload_file(ftp, filepath, name=filename)
if __name__ == '__main__':
filedir = Path(sys.argv[1])
current_module = sys.modules[__name__]
method = getattr(current_module, get_deploy_method())
method(filedir)
#!/usr/bin/env python
# Creates links from gui folder to all files in the gtk folder
# This is needed for pyright to work correctly with the dynamic gui imports
from pathlib import Path
IGNORED_FILES = ['__init__.py']
IGNORED_DIRS = ['__pycache__']
cwd = Path.cwd()
if cwd.name != 'gajim':
exit('Script needs to be excecuted from gajim repository root directory')
gui_path = cwd / 'gajim' / 'gui'
gtk_path = cwd / 'gajim' / 'gtk'
def cleanup_dir(target_dir: Path) -> None:
for path in target_dir.iterdir():
if path.name in IGNORED_FILES:
continue
if path.name in IGNORED_DIRS:
continue
path.unlink()
def link(target: Path) -> None:
source = str(target)
source = source.replace('gajim/gtk', 'gajim/gui')
source = Path(source)
source.symlink_to(target)
print('create symlink from', source, 'to', target)
def link_files(source_dir: Path) -> None:
for path in source_dir.iterdir():
if path.is_dir():
if path.name not in IGNORED_DIRS:
link(path)
elif path.name not in IGNORED_FILES:
link(path)
cleanup_dir(gui_path)
link_files(gtk_path)
#!/bin/sh
echo "$2" | tr -d '\r' | ssh-add - > /dev/null
ssh-add -l
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keyscan "$1" >> ~/.ssh/known_hosts
git config --global user.email "$CI_GIT_USER_EMAIL"
git config --global user.name "$CI_GIT_USER_USERNAME"
#!/bin/sh
# exit when any command fails
set -e
PYLINT=${PYLINT:-pylint}
# Errors which are covered by pyright
#
# E1101 no-member
# E1102 not-callable
# E1111 assignment-from-no-return
# E1120 no-value-for-parameter
# E1121 too-many-function-args
# E1123 unexpected-keyword-arg
# E1124 redundant-keyword-arg
# E1125 missing-kwoa
# E1126 invalid-sequence-index
# E1127 invalid-slice-index
# E1128 assignment-from-none
# E1129 not-context-manager
# E1130 invalid-unary-operand-type
# E1131 unsupported-binary-operation
# E1132 repeated-keyword
# E1133 not-an-iterable
# E1134 not-a-mapping
# E1135 unsupported-membership-test
# E1136 unsubscriptable-object
# E1137 unsupported-assignment-operation
# E1138 unsupported-delete-operation
# E1139 invalid-metaclass
# E1140 unhashable-dict-key
# E1141 dict-iter-missing-items
# E1142 await-outside-async
# I1101 c-extension-no-member
# W0212 protected-access
# W1113 keyword-arg-before-vararg
# W1114 arguments-out-of-order
# W1115 non-str-assignment-to-dunder-name
# W1116 isinstance-second-argument-not-valid-type
IGNORE_PYRIGHT='E1101,E1102,E1111,E1120,E1121,E1123,E1124,E1125,E1126,E1127,E1128,E1129,E1130,E1131,E1132,E1133,E1134,E1135,E1136,E1137,E1138,E1139,E1140,E1141,E1142,I1101,W0212,W1113,W1114,W1115,W1116'
IGNORE_ALWAYS='R0801,C0209,W0237,W0707,R1732,W1404,W1406,R1725'
IGNORE_ERRORS=C0103,C0302,C0301,C0330,C0411,C0415,E0401,E0611,R0201,R0901,R0904,R0912,R0913,R0914,R0915,R0916,R1702,R1710,W0201,W0221,W0223,W0231,W0233,W0603,W0613
IGNORE_GTK_MODULE_ERRORS=C0103,C0301,C0330,C0415,E0401,E0611,R0201,R0904,R0915,R1710,W0201,W0233,W0221,W0613
"$PYLINT" --version
"$PYLINT" --disable="$IGNORE_PYRIGHT,$IGNORE_ALWAYS,$IGNORE_ERRORS" --ignore=modules,dbus,gtk "$@"
"$PYLINT" --disable="$IGNORE_PYRIGHT,$IGNORE_ALWAYS,$IGNORE_GTK_MODULE_ERRORS" "$@/gtk"
"$PYLINT" --disable="$IGNORE_PYRIGHT,$IGNORE_ALWAYS,E0401,C0415" "$@/common/modules"
"$PYLINT" --disable="$IGNORE_PYRIGHT,$IGNORE_ALWAYS" "$@/common/dbus"
# C0103 invalid-name
# C0209 use-f-string
# C0301 line-too-long
# C0302 too-many-lines
# C0330 bad-continuation
# C0415 import-outside-toplevel
# E0401 import-error
# E0611 no-name-in-module
# R0201 no-self-use
# R0801 duplicat-code
# R0901 too-many-ancestors
# R0904 too-many-public-methods
# R0913 too-many-arguments
# R0912 too-many-branches
# R0914 too-many-locals
# R0915 too-many-statements
# R0916 too-many-boolean-expressions
# R1702 too-many-nested-blocks
# R1710 inconsistent-return-statements
# R1732 consider-using-with
# R1725 super-with-arguments
# W0201 attribute-defined-outside-init
# W0221 arguments-differ
# W0223 abstract-method
# W0231 super-init-not-called
# W0233 non-parent-init-called
# W0237 arguments-renamed
# W0603 global-statement
# W0613 unused-argument
# W0707 raise-missing-from
# W1404 implicit-str-concat
# W1406 redundant-u-string-prefix
......@@ -5,20 +5,24 @@ from __future__ import annotations
from typing import List
from typing import Tuple
import sys
import subprocess
import sys
ALLOWED_TAGS = [
'ci',
'feat',
'fix',
'perf',
'refactor',
'chore',
'release',
'other',
'imprv',
"ci",
"cfix",
"new",
"cq",
"feat",
"fix",
"perf",
"refactor",
"chore",
"change",
"release",
"other",
"imprv",
"revert",
]
......@@ -30,48 +34,54 @@ def parse_args() -> Tuple[str, str, str]:
def get_commit_subject(sha: str) -> str:
data = subprocess.check_output(
['git', 'log', '-1', '--pretty=format:%s', sha])
data = subprocess.check_output(["git", "log", "-1", "--pretty=format:%s", sha])
return data.decode()
def get_commit_shas(start_ref: str, end_ref: str) -> List[str]:
arg = f'{start_ref}..{end_ref}'
data = subprocess.check_output(['git', 'rev-list', arg])
arg = f"{start_ref}..{end_ref}"
data = subprocess.check_output(["git", "rev-list", arg])
text = data.decode()
text = text.strip()
return text.split('\n')
if not text:
# Can happen if commits are deleted after force push
return []
return text.split("\n")
def enforce_message_rules(subject: str) -> None:
try:
tag, subject = subject.split(': ', maxsplit=1)
tag, subject = subject.split(": ", maxsplit=1)
except ValueError:
print('Unknown commit message tag:', subject)
print("Unknown commit message tag:", subject)
sys.exit(1)
if tag not in ALLOWED_TAGS:
print('Unknown commit message tag:', tag)
print("Unknown commit message tag:", tag)
sys.exit(1)
if tag == 'release':
if tag == "release":
if not subject[0].isdigit():
print('Release commits should be of the form "release: X.X.X"')
sys.exit(1)
return
if not subject[0].isupper():
print('First letter after tag must be uppercase')
print("First letter after tag must be uppercase")
sys.exit(1)
def main(args: Tuple[str, str, str]) -> None:
ref_name, old_ref, new_ref = args
if 'refs/tags' in ref_name:
print("UPDATE", ref_name, old_ref, new_ref)
if ref_name != "refs/heads/master":
# We enforce only for master branch
return
shas = get_commit_shas(old_ref, new_ref)
for sha in shas:
print("Check", sha)
subject = get_commit_subject(sha)
enforce_message_rules(subject)
......
......@@ -2,20 +2,19 @@ syntax: glob
*.orig
*.swp
*.gmo
*.in
*.m4
*.pyc
*.pyo
*~
*#
gajim/gui/*
!gajim/gui/__init__.py
gajim/data/locale
# Cache
__pycache__/
.mypy_cache/
.ruff_cache/
# Build folders
......@@ -24,7 +23,14 @@ build/
dist/
gajim.egg-info/
win/_build_root
venv/
.venv/
node_modules/
.flatpak-builder
# IDE files
.vscode
*.sublime-project
*.sublime-workspace
.idea
image: gajim-master:latest
workflow:
rules:
- if: $GAJIM_NIGHTLY_BUILD
- if: $NIGHTLY_BUILD
- if: $DEBIAN_BUILD
- if: $WINDOWS_BUILD
- if: $DEPLOY_FLATPAK
- if: $CI_PIPELINE_SOURCE == "push"
stages:
......@@ -12,144 +13,339 @@ stages:
- publish
test-other:
image: gajim-test
stage: test
script:
- ./make.py build
- pyproject-build
- appstream-util validate dist/metadata/org.gajim.Gajim.metainfo.xml
interruptible: true
test-black:
image: gajim-test
stage: test
rules:
- changes:
- "**/*.py"
script:
- codespell -I codespell.conf --skip="*__pycache__*,gajim/data/icons,gajim/data/sounds,gajim/data/emoticons" gajim
- python3 setup.py build
- appstream-util validate build/data/org.gajim.Gajim.appdata.xml
- black --version
- black --check .
interruptible: true
test-codespell:
image: gajim-test
stage: test
script:
- codespell --version
- codespell gajim
interruptible: true
test-pyright:
image: gajim-test
stage: test
rules:
- changes:
- "**/*.py"
script:
- pip3 install git+https://dev.gajim.org/gajim/python-nbxmpp.git
- pip3 install git+https://github.com/pygobject/pygobject-stubs.git
- npm install pyright
- python3 .ci/link-gtk.py
- $(npm bin)/pyright --version
- $(npm bin)/pyright
- pip install git+https://dev.gajim.org/gajim/python-nbxmpp.git
- pip install git+https://dev.gajim.org/gajim/omemo-dr.git
- pip install --config-settings=config=Gtk4,Gdk4,GtkSource5 git+https://github.com/pygobject/pygobject-stubs.git
- pyright --version
- pyright
interruptible: true
test-pylint:
test-ruff:
image: gajim-test
stage: test
rules:
- changes:
- "**/*.py"
script:
- pip3 install -I git+https://dev.gajim.org/gajim/python-nbxmpp.git
- .ci/pylint.sh --jobs=2 gajim
- ruff --version
- ruff check .
interruptible: true
test-isort:
image: gajim-test
stage: test
rules:
- changes:
- "**/*.py"
script:
- isort --version
- isort --check .
interruptible: true
test-unittest:
image: gajim-test
stage: test
script:
- pip3 install -I git+https://dev.gajim.org/gajim/python-nbxmpp.git
- pip install git+https://dev.gajim.org/gajim/python-nbxmpp.git
- coverage run --source=gajim -m unittest discover -s test -v
- coverage report -mi
- coverage xml -i
coverage: "/TOTAL.+ ([0-9]{1,3}%)/"
artifacts:
reports:
cobertura: coverage.xml
coverage_report:
coverage_format: cobertura
path: coverage.xml
interruptible: true
build-linux:
image: gajim-deb-build:latest
build-unix:
image: gajim-build
stage: build
dependencies: []
rules:
- if: '$GAJIM_NIGHTLY_BUILD'
- if: '$DEBIAN_BUILD'
- if: '$NIGHTLY_BUILD'
- if: '$CI_COMMIT_TAG'
script:
- python3 setup.py sdist
- python3 .ci/debian_build.py "$(find dist/gajim-*)" 1
- ./make.py build
- pyproject-build
artifacts:
name: "gajim-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA"
expire_in: 1 week
paths:
- dist/gajim-*.tar.gz
- dist/gajim-*.whl
build-and-deploy-windows:
build-debian-nightly:
image: gajim-build
stage: build
rules:
- if: '$GAJIM_NIGHTLY_BUILD'
- if: '$CI_COMMIT_TAG'
variables:
DEPLOY_TYPE: "windows"
REV: "1"
needs:
- job: build-unix
artifacts: true
rules:
- if: '$DEBIAN_BUILD'
- if: '$NIGHTLY_BUILD'
allow_failure: true
script:
- python3 .ci/appveyor_build.py
- python3 .ci/deploy.py build
- apt-get update
- apt-get install -y python3-nbxmpp-nightly
- apt-get install -y python3-omemo-dr
- release-helper build-debian-pkg "$(find dist/gajim-*.tar.gz)" $REV --pkgsuffix=nightly
# artifacts:
# expire_in: 1 day
# paths:
# - build/Gajim-*.exe
artifacts:
name: "gajim-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA"
expire_in: 1 week
paths:
- debian_build/*
deploy-linux:
# build-windows:
# image: gajim-build
# stage: build
# dependencies: []
# rules:
# - if: '$CI_COMMIT_TAG'
# script:
# - >
# release-helper build-windows-pkg \
# --account=lovetox \
# --repository=https://dev.gajim.org/gajim/gajim \
# --branch=master \
# --version=$CI_COMMIT_TAG \
# --commit-sha=$CI_COMMIT_SHA \
# --api-key=$APPVEYOR_API_KEY \
# .ci/appveyor.yml
# artifacts:
# expire_in: 1 day
# paths:
# - windows_build/*.json
build-windows-nightly:
image: gajim-build
stage: build
dependencies: []
rules:
- if: '$NIGHTLY_BUILD'
- if: '$WINDOWS_BUILD'
script:
- >
release-helper build-windows-pkg \
--account=lovetox \
--repository=https://dev.gajim.org/gajim/gajim \
--branch=master \
--version=Nightly \
--commit-sha=$CI_COMMIT_SHA \
--api-key=$APPVEYOR_API_KEY \
.ci/appveyor.yml
artifacts:
expire_in: 1 day
paths:
- windows_build/*.json
deploy-unix:
image: gajim-deploy
stage: deploy
needs: ['build-linux']
dependencies:
- build-unix
rules:
- if: '$GAJIM_NIGHTLY_BUILD'
- if: '$CI_COMMIT_TAG'
variables:
DEPLOY_TYPE: "linux"
script:
- python3 .ci/deploy.py dist
- >
release-helper deploy-to-ftp \
--host=$FTP_HOST \
--user=$FTP_USER \
--password=$FTP_PASS \
--directory=downloads/"$(echo $CI_COMMIT_TAG | cut -c 1-3)" \
--rename=gajim-$CI_COMMIT_TAG.tar.gz \
"$(find dist/gajim-*.tar.gz)"
deploy-unix-nightly:
image: gajim-deploy
stage: deploy
dependencies:
- build-unix
needs:
- build-unix
rules:
- if: '$NIGHTLY_BUILD'
allow_failure:
exit_codes:
- 100
script:
- release-helper nightly-check
- >
release-helper deploy-to-ftp \
--host=$FTP_HOST \
--user=$FTP_USER \
--password=$FTP_PASS \
--directory=downloads/snap \
--rename=gajim-"$(date +'%Y-%m-%d')".tar.gz \
"$(find dist/gajim-*.tar.gz)"
deploy-debian-nightly:
image: gajim-deploy
stage: deploy
dependencies:
- build-debian-nightly
needs:
- build-debian-nightly
rules:
- if: '$DEBIAN_BUILD'
- if: '$NIGHTLY_BUILD'
allow_failure: true
script:
- |
if [ "$FORCE_DEB_DEPLOY" != "true" ]
then
release-helper nightly-check
fi
- >
release-helper deploy-to-ftp \
--host=$FTP_HOST \
--user=$FTP_USER \
--password=$FTP_PASS \
--directory=debian/gajim/"$(date +'%Y%m%d')" \
debian_build
# deploy-windows:
# image: gajim-deploy
# stage: deploy
# needs: ['build-windows']
# dependencies:
# - build-windows
# rules:
# - if: '$GAJIM_NIGHTLY_BUILD'
# - if: '$CI_COMMIT_TAG'
# when: manual
# variables:
# DEPLOY_TYPE: "windows"
# script:
# - python3 .ci/deploy.py build
# - release-helper download-appveyor-artifacts "$(find windows_build/*.json)" windows_build
# - rm windows_build/*.json
# - >
# release-helper deploy-to-ftp \
# --host=$FTP_HOST \
# --user=$FTP_USER \
# --password=$FTP_PASS \
# --directory=downloads/"$(echo $CI_COMMIT_TAG | cut -c 1-3)" \
# windows_build
deploy-windows-nightly:
image: gajim-deploy
stage: deploy
dependencies:
- build-windows-nightly
needs:
- build-windows-nightly
rules:
- if: '$NIGHTLY_BUILD'
- if: '$WINDOWS_BUILD'
allow_failure:
exit_codes:
- 100
script:
- release-helper nightly-check
- release-helper download-appveyor-artifacts "$(find windows_build/*.json)" windows_build
- rm windows_build/*.json
- >
release-helper deploy-to-ftp \
--host=$FTP_HOST \
--user=$FTP_USER \
--password=$FTP_PASS \
--directory=downloads/snap/win \
windows_build
deploy-flatpak:
image: git-deploy:latest
image: gajim-deploy
stage: deploy
needs: []
dependencies: []
rules:
- if: '$DEPLOY_FLATPAK'
- if: '$CI_COMMIT_TAG'
before_script:
# - echo "${FLATHUB_DEPLOY_KEY}" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- ssh-keyscan https://github.com >> ~/.ssh/known_hosts
- eval $(ssh-agent -s)
- .ci/prepare_git.sh github.com "${FLATHUB_DEPLOY_KEY}"
script:
- git config user.email "$CI_GIT_USER_EMAIL"
- git config user.name "$CI_GIT_USER_USERNAME"
- git clone https://github.com/flathub/org.gajim.Gajim.git
# extract the current commit hash of the shared-modules submodule
- submodule_commit=$(git submodule status flatpak/shared-modules | cut -c 2-41)
- git clone git@github.com:flathub/org.gajim.Gajim.git
- cd org.gajim.Gajim
- mv ../flatpak/org.gajim.Gajim.yaml org.gajim.Gajim.yaml
- mv ../flatpak/app-overrides.json app-overrides.json
# point the shared-modules submodule to the new commit, without fetching the repository
- git update-index --cacheinfo 160000,${submodule_commit},shared-modules
- git diff
- git add org.gajim.Gajim.yaml
- git commit -m "$CI_COMMIT_TAG"
# - git push
- git add --all
- git commit -m "$CI_COMMIT_TAG$DEPLOY_FLATPAK"
- git push
publish-release:
image: git-deploy:latest
publish-website:
image: gajim-publish
stage: publish
needs: ['deploy-linux', build-and-deploy-windows]
dependencies: []
rules:
- if: '$CI_COMMIT_TAG'
before_script:
- echo "${WEBSITE_DEPLOY_KEY}" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- ssh-keyscan dev.gajim.org >> ~/.ssh/known_hosts
- eval $(ssh-agent -s)
- .ci/prepare_git.sh dev.gajim.org "${WEBSITE_DEPLOY_KEY}"
script:
- git config --global user.email "$CI_GIT_USER_EMAIL"
- git config --global user.name "$CI_GIT_USER_USERNAME"
- git clone git@dev.gajim.org:gajim/website.git
- cd website
- git checkout master
- python3 ./scripts/bump_version.py $CI_COMMIT_TAG
- python ./scripts/bump_version.py $CI_COMMIT_TAG
- git diff
- git add -u
- git commit -m "Release Gajim $CI_COMMIT_TAG"
- git push
publish-release:
image: gajim-publish
stage: publish
dependencies: []
rules:
- if: '$CI_COMMIT_TAG'
script:
- >
release-helper finish-milestone \
$CI_PROJECT_ID \
$PROJECT_TOKEN \
--version=$CI_COMMIT_TAG \
--title="Next Release"
- >
release-helper create-release \
$CI_PROJECT_ID \
$PROJECT_TOKEN \
--version=$CI_COMMIT_TAG \
--tag=$CI_COMMIT_TAG \
--milestone=$CI_COMMIT_TAG
*Release date: xx xxx xxxx*
## Things to do before release:
## Preparations
* [ ] xxx
* [ ] Raise nbxmpp version (if necessary)
## Build
* [ ] Merge translations from Weblate
* [ ] Update `ChangeLog`
* [ ] Update IANA data with `./scripts/get_iana_data.py gajim/common/iana.py`
* [ ] Run `./scripts/update_flatpak_manifest.py`
* [ ] Run `./scripts/bump_version.py x.x.x`
* [ ] Push release tag `x.x.x`
* [ ] Upload .msixbundle to Windows store
* [ ] Close release milestone after new milestone has been created automatically
## Update
* [ ] Website: Write announcement post with changelog
* [ ] Website: Update Download section on gajim.org (set [current version and update installer links](https://dev.gajim.org/gajim/website/blob/master/themes/beautifulhugo/data/Gajim.json))
* [ ] Website: Update screenshots
* [ ] Website: Merge website translations from Weblate
* [ ] MUC: Update MUC subject on gajim@conference.gajim.org
* [ ] Publish release post on [Fosstodon](https://fosstodon.org/@gajim)
repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.9.7
hooks:
- id: ruff
exclude: ".githooks/"
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
hooks:
- id: codespell
pass_filenames: false
additional_dependencies:
- tomli
- repo: https://github.com/RobertCraigie/pyright-python
rev: v1.1.394
hooks:
- id: pyright
pass_filenames: false
additional_dependencies:
- nbxmpp @ git+https://dev.gajim.org/gajim/python-nbxmpp.git
- PyGObject-stubs @ git+https://github.com/pygobject/pygobject-stubs.git
- python-gitlab
- ruamel.yaml
- sentry-sdk
stages: [manual]
- repo: https://github.com/pycqa/isort
rev: 5.13.2
hooks:
- id: isort
- repo: https://github.com/psf/black
# The `refs/tags/<tag>:refs/tags/<tag>` is needed for black's required-version to work:
# https://github.com/psf/black/issues/2493#issuecomment-1081987650
rev: 'refs/tags/24.10.0:refs/tags/24.10.0'
hooks:
- id: black
- repo: https://github.com/fsfe/reuse-tool
rev: v5.0.2
hooks:
- id: reuse
stages: [manual]
......@@ -34,14 +34,24 @@ # Commit Messages
Every commit message must be prefixed with one of the following tags:
- ci (ci related changes)
- feat (functionality of the application was changed)
Changelog relevant
- feat (a new feature was added)
- fix (something was fixed)
- perf (performance related changes)
- imprv (improvements)
- change (existing functionality was changed)
Prefixes for development
- new (new code, but the end user will not notice)
- ci (ci related changes)
- cq (code quality changes e.g. formatting, typing, codestyle)
- cfix (code fixes which should not show up in the changelog)
- refactor (code was changed, but the end user will not notice)
- chore (reoccuring tasks which need to be done)
- release (only used for release commits)
- revert (used when a commit needs to be reverted)
- other
Further the first letter after the tag must be upper case
......@@ -49,3 +59,28 @@ # Commit Messages
Example:
`feat: New Button which does something`
# Use pre-commit
Execute the following inside the repository dir
$ pip install pre-commit
$ pre-commit install
Now pre-commit will run various checks before code can be committed.
To update to the newest versions
$ pre-commit autoupdate
# Man Pages
Man pages are written in markdown and converted with pandoc
While developing this command is useful to preview the manpage
$ pandoc gajim.1.md -s -t man | /usr/bin/man -l -
To convert the markdown
$ pandoc gajim.1.md -s -t man -o gajim.1
Gajim 2.0.4 (19 Mar 2025)
Improvements
* Code widget: Improve handling for single line entries
* GroupchatRoster: Improve participant sorting
* StartChat: Add Sort by Status option
* Assistants: Improve button order and color-coding
Bug Fixes
* Storage: Fix error on big queries (#12148)
* Disable start chat buttons if no accounts are active
* Account wizard: Fix selecting default connection type in advanced settings (#12236)
* MUC: Ignore invites sent by other devices of ours
* MUC: Don’t fail on presence from bare jids (#12232)
Gajim 2.0.3 (15 Mar 2025)
New
* Store/Restore the size of dialogs
Improvements
* Group chats: Improve strings for events
Bug Fixes
* MUC: Fix handling affiliation/role change error handling
* StatusIcon: Show correct state for mute sounds option
* AdHoc: Don't fail if dataform widget is not set when cancelling (#12227)
* Chat: Send read marker only when chat is at bottom
* ChatControl: Handle autoscroll-changed without active chat (#12226)
* MUC: Don’t fail on displaying affiliation change
Gajim 2.0.2 (10 Mar 2025)
New
* Use XEP-0172 nickname of contacts not in roster (#11476)
* Moderation: Support Message Moderation 0.3.0
Improvements
* Moderation: Improve moderation text
* Remove 'ambiguous-address' URI processing (#12192)
* Simplify URI context menu (#12207)
* Improve confirmation dialog strings
Change
* Don't handle file URIs
* Display a warning when trying to add domain JID
Bug Fixes
* MessageInput: Do not crash on message send (#12158)
* MUC: Ensure MUCData is initiated with jid string (#12222)
* ContactNameWidget: Add more conditions for enabling edit mode (#12221)
* Helpers: Check for empty bytes objects when loading file async (#12220)
* HistoryExport: Export messages in ascending order (#12218)
* StartChatDialog: Do not crash, when dialog closes after starting new chat (#12213)
* Make dragged chat stick to cursor
* Menus: Create menu on button click (#12214)
* Ad-hoc commands: Expand list of commands vertically (#12206)
* History export: Skip ResourceContacts for export (#12208)
Gajim 2.0.1 (02 Mar 2025)
Improvements
* Start Chat: Add confirmation dialog for 'Forget this Group Chat' action (#12199)
Bug Fixes
* MUC: Don’t query avatars if not allowed
* EventStorage: Serialize JIDs correctly
* StartChat: Don't crash when groupchat is in Roster
* SettingsDialog: Fix showing dialogs
* Preferences: Show missing titles for settings again
* Show audio input selection again (for voice messages)
* Preferences: Update themes list when removing theme
Gajim 2.0.0 (27 Feb 2025)
New
* Port to Gtk4
* Generate previews with multiple processes
* Add Manage Roster Dialog
* Add message row menu entry for moderating all messages of participant
* Add new completion popover
Improvements
* DebugConsole: Use Dropdown for account selection and improve account order
* StatusIcon: Consider suspended state on show/hide action
* Features: Hide not maintained features
* Preferences: Hide Audio/Video settings
* Don’t close chat on remove contact action
* Chat: Add remove contact menu entry
* NickChooser: Show error tooltip for invalid nicknames
* Control: Disable message selection via Escape key
* Make exporting/removing individual chat history accessible
* HistoryExport: Allow exporting individual chats
* Add profile name to window title (#12168)
* GroupChatVoiceRequestButton: Fix updating content, scroll content, improve test
* MessageActionsBox: Enable more actions for offline message composing
* MessageActionsBox: Enable message composing while offline (#11759)
* FullMessageWindow: Wrap text and add padding
* StartChat: Make dialog look more compact
* VoiceRequestsButton: Show JID for each request
* ChatFilter: Add account filter
* Chat Filters: Use a popover for filters and add roster group filter
* Message Actions Box: Show user feedback when pasting images (#11489)
* Start Chat: Include contact groups in search
* Group Chats: Add 'Direct Message' menu item to participants menu (#12146)
* Logging: Harmonize logging timestamps
* Preview: Use native theme colors and improve styling
* MessageRowActions: Don't show actions if message selection is active
* Preview: Style and layout improvements
* Preview: Show controls on hover and improve styling
* Debug Console: Use different colors depending on light/dark preference
Change
* Raise nbxmpp version
* Require Python 3.11
* Remove legacy config code and migration
* Plugins: Rename tooltip extension point
* Remove Roster
* Remove Synchronize Accounts Dialog
* Remove Bookmark Dialog
* Preview: Raise default size from 300 to 400
* Windows: Store images in the users Downloads folder
* Disable Jingle file transfer support
Performance
* Message display: Reduce maximum message length to 1000 characters
Bug Fixes
* BitsOfBinary: Fix module data handling
* ChatStack: Fix leak with Previews when switching to another workspace
* Blocking: Don’t convert to lower case when saving
* Fix app.window.add_chat() calls and add typings for chat type
* Labels: Fix Pango word/character wrapping
* Hide drop area after file drop (#12143)
* MessageActionsBox: Fix message input scrolling out of view (#12158)
* Profile: Fix handling async result while closing (#12159)
* PasswordDialog: Show dialog for multiple accounts
* Contacts: Check for existing chat contacts when adding group chat contact
* NicknameCompletion: Only consider incoming messages
* RosterItemExchange: Fix accessing contact subscription
* Debug Console: Fix search occurrence position (#11999)
* Voice Message: Handle error when temp folder is not available
* Translations: Use standard ngettext method (#11997)
Gajim 1.9.5 (30 Sep 2024)
Improvements
* DebugConsole: Show "Log" when opening the dialog
* DebugConsole: Improve search for XML logs (#11992, #11181)
* Datafroms: Display text-multi fields without scrolled window
* Inform user when referenced message cannot be found
Change
* Move chat state indicator above message input
* Windows: Disable file system virtualization for MS Store app
Bug Fixes
* Windows: Fix Notification AUMID for MS Store install (#11965)
* Windows: Fix detecting MS Store version
* Preview: Update preview object while updating progress (#11991)
* Dataforms: Don’t try to calculate label size (#11990)
* Groupchat: Wrap long nicknames in subject row
* StartChat: Fix global search results missing the name in some cases (#11985)
* Build: Build translations for all distributions again
Gajim 1.9.4 (19 Sep 2024)
New
* Add setting to prevent sync of group chats
* XEP-0317 (Hats)
* Integrate providers.xmpp.net into account creation wizard
* Search: Add user interface for message filters
Improvements
* Create a common directory for temporary files
* Unify usage of 'synchronise'/'synchronize' strings
* Control: Improve query to load messages around a timestamp
* Dataforms: Improve read only form presentation (#11758)
* Indicate modified contact name in info dialogs (#11777)
* StartChat: Show description, user count, and language in search results (#11963)
* Add Quit dialog for setting window preference (#11481)
* Search: Add fade-in effect for results and make search icon spin
* Search: Indicate search state with placeholder
* Message rows: Use transition for row highlight (#11932)
Change
* Raise nbxmpp version to 5.0.4
* Build: Move all configure/build/installation steps into single script
* ChatControl: Show typing indicator in a separate widget (#11913)
* Search: Use quotes to mark search filter content (#11355)
Bug Fixes
* Parse xmpp IRI correctly
* Display error message correctly when missing dependencies
* MUC: Display errors related to nickname change (#11930)
* DBus: Use correct app id
* JingleFileTransfer: Fix message data argument
* Dataforms: Fix completion of single list forms
* Catch KeyringLocked error when trying to delete a password (#11978)
* Debug Console: Catch errors before trying to send stanzas (#11976#11301)
* Menu: Fix 'Mark as read' action not sending read marker
* MessageRowActions: Enable scrolling while cursor rests on action (#11968)
* GroupchatRoster: Fix loading roster while participants are added/removed (#11970)
* StartChat: Only search s.j.n if there is a search string
* GroupchatRoster: Fix filtering for participants with status set (#11958)
* ChatListStack: Fix default workspace id when getting current chat list (#11969)
* Fix wrapping lines for long words
* MessageRowActions: Make actions more robust (#11950)
* Notifications: Prevent loading of windows_toasts on unsupported Windows versions (#11944)
* Debug Console: Fix Ctrl+F hotkey (#11940)
* MessageInputTextView: Make background transparent
* GroupChatRoster: Fix hover style scope to avoid hidden scrollbar thumb (#11936)
* Search: Allow to search for same string again
Notes
Attention to all package maintainers, this changes how Gajim is build.
Please check README.md for more information.
Gajim 1.9.3 (28 Jul 2024)
Improvements
* DebugConsole: Dynamically add stanza presets and add XEP-0092 query
Change
* Make Chatlist and Groupchat Roster style consistent
Bug Fixes
* Fix Gajim not starting when installed via MS Store
* Send read marker when receiving a message in a chat that has the focus.
* AccountWizard: Avoid crash on destroy by moving attribute declaration to top (#11927)
* MessageRowActions: Fix issue with row hover in conjunction with switching chats (#11925)
* Use correct mimetype for DND in flatpak
* Messages: Treat type=normal messages as chat messages
* SearchView: Fix search when changing scope for the same search string (#11915)
Gajim 1.9.2 (19 Jul 2024)
New
* Optionally unregister from group chats on close
* Make HTTP links clickable in room descriptions
* Show participant avatar in MUC notifications
* Windows: Add native Windows notifications (#11789, #10662)
Improvements
* ChatCommands: Improve styling and add hint for double slash usage
* Proxies: Add option to ignore system proxies
* MessageRowActons: Hide quick reactions on narrow screens (#11888)
* Notifications: Register AUMID on Windows
* MessageRowActions: Adjust floating offset for merged messages (#11897)
* AboutDialog: Add package information
* Dataforms: Improv display of simple forms
* Don't check for updates if running from MS Store (#11881)
Change
* Remove gajim-url theme parameter (#11894)
Performance
* MessageRowActions: Fix memory leak
Bug Fixes
* OMEMO: Don’t delete signed pre keys before catchup
* SearchView: Prevent burst of db queries when holding enter (#11902)
* ChatListRow: Indicate received file for encrypted messages
* Fix nickname completion in group chats (#11895)
* RosterItemExchange: Display optional message in the chat (#11900)
* GroupchatRoster: Fix menu not pointing to cursor (#11890)
* SynchronizeAccounts: Fix dialog for starting with unavailable account (#11901)
* MessageRowActions: Fix widget margin in RTL mode (#11891)
* Remove unnecessary space between quotes (#11886)
* MessageRowActions: Make on_hover method more robust (#11884)
* Corrections: Load correct message (#11883)
Gajim 1.9.1 (22 Jun 2024)
New
* Menu: Add main menu button (#11811)
Improvements
* ChatFunctionPage: Show MUC address when displaying error
* SecurityLabels: Allow correction of labels
* Use different icon for context menu on contact list page
* Unify wording for 'Toggle Menu Bar'
* ConversationView: Use better method for scrolling to row (#11094, #11840)
Change
* Raise nbxmpp version
Bug Fixes
* Reactions: Show timestamp in correct timezone (#11875)
* Search: Don’t search messages of disabled accounts (#11876)
* DebugConsole: Fix filtering stanzas when combining accounts and types
* VoiceMessageRecorderButton: Honor visibility setting on startup (#11872)
* SecurityLabels: Fix merging messages with same security label
* ChatActionProcessor: Make handling selected action more robust (#11871)
* Settings: Store account jid in dedicated setting (#11864)
* Migration: Don’t fail on invalid JIDs (#11862)
* HistorySync: Make full sync option work again
Gajim 1.9.0 (10 Jun 2024)
New
* Add Voice Messages
* Support XEP-0425 0.3.0
* Add XEP-0444: Message Reactions
* Add support for XEP-0461: Message Replies
* Display emoji-only messages with a larger font
* Feedback on affiliation change failures
* Hide/show main menu bar
* Add option to remove group chat avatar
* Plugins: Add extension point for adding chat commands
* Use default encryption setting for group chats
* MessageInputTextView: Change to GtkSource.View and refactor buffer handling (#11639#11695)
* StartChat: Show roster groups
* StartChat: Show last seen
* StartChat: Show contact tooltip on avatar
* StartChat: Show status message
Improvements
* Menus: Rename 'Modify Accounts' to 'Manage Accounts'
* AdHocCommands: Display note type icon
* Preferences: Relax preconditions for audio settings
* SearchView: Show only time_format in result rows
* AudioPreview: Use symbolic icon
* MessageRow: Pop up chat row menu to the top
* Add transport icons to MUC avatars
* ConversationView: Add MessageRowActions
* XML Console: Add jump to end button (#11828)
* Dismiss invitation notification when MUC is joined
* MessageActionsBox: Show connection state and correction hint (#11819#11791)
* ChatCommands: Handle /me command (#11778)
* Notifications: Make avatars available on more platforms
* Notify of new members in private MUCs
* Change 'Topic' to 'Subject' in group chat details
* GroupChat: Improve default room config
* ChatPage: Show workspace settings button on hover and move filter button next to search bar
* ChatBanner: Use better tooltip for chat details button
* StartChat: Improve label layout
Change
* Raise nbxmpp version
* Rename XML Console to Debug Console
* Windows: Use PyWinRT instead of winsdk
Bug Fixes
* MessageLabel: Prevent potential segfault
* Preview: Catch permissions related exceptions when trying to save as
* Jingle: Fix IBB fallback
* Application: Reactived feature actions after sm resume
* AccountWizard: Fix layout for SecurityWarning heading
* Store message drafts when switching workspaces (#11824)
* Cursors: Attempt to fix getting default cursor on Wayland
* ChatControl: Don't fail when trying to jump to deleted message
* VCardAvatars: Don’t fail when there is no disco info available
* ServerInfo: Don't fail if there is no certificate (#11822)
* Prevent message row merging if message receipt status differ
* Icons: Convert feather/lucide icons to paths in order to fix rendering issues
* Replies: Fix icon color contrast in dark mode (#11815)
* ConversationView: Allow consecutive highlights for the same row (#11813)
* MessageRow: Check for message direction when trying to merge rows (#11599)
* Keyring: Catch more exceptions for delete_password (#11793)
* ServiceDiscoveryWindow: Catch RuntimeError when starting without connection (#11809)
* MessageInput: Fix Hangul last-letter bug
* Utils: Catch exceptions when trying to load surfaces and icons (#11800)
* HTTPFileTransfer: Improve error fallbacks (#11799)
* ComponentSearch: Convert all items to str when copying result row (#11797)
* Catch errors when trying to store pasted image (#11787)
* Advertise message styling support
* Preview: Set downloading state early to avoid having multiple downloads simultaneously (#11775)
* ChatActionProcessor: Fix text buffer interaction (#11769)
* ChatBanner: Disable selecting name_label (#11732)
* AdHoc: Send adhoc command to resource if there is one
* Settings: Include all default settings as fallback
* DBus: Don’t fail if no file descriptor list is returned
* Require a space after '/me'
* Don’t fail to start on sentry_sdk import error
* OMEMO: Process events only once per account
* MessageInput: Don’t shift focs when pressing SHIFT (#11715)
* Shortcuts: Fix focus issues with Ctrl+ shortcuts for Windows and Linux
* Servers: Remove defunct servers from server list
* Windows: Use os.startfile with 'open' parameter
* Windows: Remove problematic DLL
Gajim 1.8.4 (25 Nov 2023)
New
* Add shortcuts for quoting previous messages
Improvements
* Raise nbxmpp log level
* Passwords: Use JID as username instead of account (#11684)
* MUC: Allow nick change for IRC channels
* HTTPUpload: Remove temporary files after transfer (#11579)
* MessageInput: Regain focus on common key presses
Change
* Raise nbxmpp version
Bug Fixes
* ShortcutWindow: Remove duplicated entry
* SearchView: Fix displaying results for newly created group chats (#11681)
* ChatList: Update mute state periodically (#11456)
* Icons: Register icon size to make it work for scale > 1
* Message input: Don't allow text actions if input is disabled
* Avatar: Draw status circle correctly for scale > 1
Gajim 1.8.3 (06 Nov 2023)
Improvements
* Profile: Show error page on errors after saving
* Close main window when pressing Escape key (#11543)
Bug Fixes
* GroupchatRoster: Display participants correctly on reveal
* Filetransfer: Always focus confirm button (#11672)
* AccountWizard: Don’t allow multiple anonymous accounts for the same domain
* AccountPage: Show anonymous address
* Accounts: Don’t try to save password for anonymous accounts
* Message row menu: Show quote and copy actions only if there is text (#11652)
* Audio/Video: Disable broken stun server code (#11559)
* Presence: Don’t fail on unknown MUC presences (#10967)
* Control: Add events with correct timestamp (#11670)
* Avatar: Send presence after changing avatar (#11669)
* ServerInfo: Use domain instead of hostname for queries (#11653)
* Emojis: Improve detection of shortcode start (#11594)
* DBusFileManager: Set self._proxy attribute on init (#11668)
* GroupchatRoster: Check for contact before trying to load roster (#11666)
Gajim 1.8.2 (29 Oct 2023)
New
* Allow adjusting user interface font size via hotkeys (#11343)
* Display composing participants in MUC chat banner
* ChatBanner: Show contact tooltip when hovering the avatar
* Hint that a contact is a bot in the chat banner
* Support multiple item dataforms (#10857)
* Display gateway icon in avatars
* RosterTooltip: Display BareContact presence (#10963)
* Display status message in banner
* ChatMenu: Always show "Execute command" action
Improvements
* MUC features: Use better icons for public and anonymous properties (#11585)
* Allow GroupChatInfoScrolled to be set with minimal information (#11662)
* Settings: Allow to set step size for spin settings; bind setting value
* StartChat: Better discover MUC services
* StartChat: Allow to start chats with domain JIDs
* ChatBanner: Don't show QR code for privated MUCs (#11647)
* Windows: Add gst-plugins-bad dependency for broader media preview support (#11638)
* MUC: Raise rejoin timeout
* Accounts: Be more consistent with chat state settings
* GroupChatInfo: Improve scaling of subject text (#11586)
* Windows appx: Add URI handler for xmpp: URIs
Change
* Raise GLib version
* Avatar: Don’t use custom avatar for IRC group chats
* Raise nbxmpp version
* Depend on Pillow >= 9.1.0
Performance
* View: Reset view faster
Bug Fixes
* VideoPreview: Disable preview on destroy (#11657)
* GroupchatDetails: Depend on joined state for some elements (#11661)
* GroupChatInfo: Align max width of labels
* SynchronizeAccounts: Adapt to connection state changes (#11650, #11651)
* Tooltip: Do not escape presence status text
* Chatstates: Remove timeout id on remote timeout
* NotificationManager: Update actions if online state changes (#11642)
* Caps: Add disco info to cache after query
* MUC: Don’t show old join errors when disconnected from room
* MUC: Always remove rejoin timer when closing chat
* MUC: Update state correctly on disco info error
* Switch phone icon to something more widely supported
* ChatListStack: Handle missing last visible child
* Observable: Fix race condition when removing handlers
* PasswordDialog: Use verb instead of noun for log in button
* AdHoc: Wrap notes label
* Unpack string correctly while handling update error
* CSSConfig: Quote font-family property correctly (#11600)
* File transfers: Don't fail when tryting to send non-existing file
* MusicTrackListener: Don't fail if playing track could not be determined (#11607)
* Catch error if loading image with PIL fails due to unidentifiable image (#11616)
* CSSConfig: Fix parsing float sizes for font description
* Modules: Make sure BaseModule.cleanup() is always called on destroy
* Roster: Unregister all handlers on destroy
* Observable: Don’t allow to register handler multiple times
* View: Add newline after username when copying a message (#11610)
* Show notification on group chat mentions again (#11613)
* Make it impossible to connect without config (#11608)
Gajim 1.8.1 (07 Aug 2023)
New
* Add setting for default encryption
Improvements
* XMLConsole: Enable browsing sent stanzas in message input (#5403)
* Sort cprofile output after total time
* Moderation: Handle unknown moderator JID
* Preview: Always show preview widget (#11427)
* Preview: Add loading placeholder (#11264)
* Account page: Show our XMPP address
Performance
* Idle: Raise poll interval
Bug Fixes
* Search: Don't fail while closing if no chat has been loaded before (#11588)
* Dataform: Correctly serialize multi list fields
* Profile: Respect avatar/nickname privacy setting on consecutive changes (#11584)
* Don’t forget ignored TLS errors from previous connects (#11574)
* App menu: Add missing mnemonic for Accounts menu
* Gateway: Fix roster method call
* Contacts: Fix supports_{audio,video} property
* AvatarSelector: Fix crash on reset (#11563)
* CertificateBox: Catch exception if cert does not offer extension (#11560)
* CreateGroupchatWindow: Improve handling of MUC service availability (#11557)
* Preview: Show error if file saving directory is not available (#11558)
* SecurityLabels: Display labels for messages received with MAM
* DataForm: Handle destroy correctly (#11548)
* ChatListRow: Always update group chat name
* Fix showing MAM sync errors and show error text
* OMEMOTrustManager: React correctly to connection changes (#11547)
* Fix interaction of GroupchatRoster and SearchView (#11546)
* Init plugin translation module later
* GroupchatManage: Improve checks for joined state (#11231)
* Search: Restore group chat participants list to previous state when closing search (#11536)
* Windows themes: Don't fail hard when winsdk UISettings are not available (#11542)
Gajim 1.8.0 (27 May 2023)
New
* XMLConsole: Add logging view
* JID sharing: Include verified OMEMO fingerprints
* Detect dark theme on Windows
* Integrate OMEMO plugin
* Redesign Group Chat actions (#10362)
Improvements
* Audio preview: Support more mime types
* ChatBanner: Add share instructions
* ChatList: Clear row content when removing history (#11420)
* XMLConsole: Always use dark theme
* AboutDialog: Show libsoup version
* GroupchatState: Show MAM sync
* ChatList: Improve sorting
* Make contact details/settings available when offline
* ACE: Make descriptions selectable and copyable
* Notifications: Withdraw all when a corresponding chat is read (#11030)
* ChatList: Show indicator if group chat is not connected
* ChatList: Show indicator when joining group chat
* StartChat: Don't filter for account labels (#11494)
* ChatStack: Only respond to supported drag-n-drop types while dragging
* App menu: Add menu entry for privacy policy
* GroupchatRoster: Highlight own nick and sort it to the top (#11431)
* CertificateDialog: Add additional infos and remove org unit field (#11461)
* GroupchatDetails: Hide OMEMO page in public MUCs
* ChatBanner: Add QR code for sharing JIDs (#11429)
* Windows: Package pixbuf loaders for avif and webp
Change
* Raise nbxmpp version
* Remove "escape_key_closes" from ACE
* Enable spell checker by default
* OMEMO verification: Generate URIs with pedantically correct query
* Raise gajim when no cmdline options are provided (#11482)
Performance
* QR codes: Avoid roundtrip to PNG in storage and back
Bug Fixes
* ProfileWindow: Don't fail when no vcard is set
* ContactInfo: Don’t fail when no vcard is set
* Message menu: Fix issue with chats not supplying correct ID
* Exceptions: Fix sending reports via sentry in conjunction with proxy settings
* ChatActionProcessor: De-duplicate emojis
* Fix encryption deadlock with changed MUC configurations (#11421)
* UI: Update avatar on muc-disco-update
* AvatarSelector: Fix that images don't display after repeated loading
* SearchView: Don't change search context when switching chats (#11533)
* SearchView: Remove overlay (#11412)
* ChatActionProcessor: Allow to click items with mouse cursor (#11445)
* MessageWidget: Don't return truncated text for message actions Fixes [#11526](https://dev.gajim.org/gajim/gajim/issues/11526) (#11526)
* Idle: Use default xa implementation for XSS backend (#11522)
* ConversationView: Fix loading messages going forward from specific point (#11201)
* ACE: Handle invalid numeric values gracefully
* XMLConsole: Select first account by default (#11498)
* Fix rendering of copied code blocks and quotes (#11499)
* ContactInfo: Improve behavior for connection changes
* Fix access to GnuPG keys on flatpak (#621)
* Fix showing status icon on flatpak
* Escape JIDs for xmpp URIs everywhere
* Ask for confirmation when leaving a MUC while offline (#11487)
* ContactInfo: Improve behavior for connection changes (#11439)
* Make manually changing the pinned chat sort order work again
* MessageActionsBox: Update send file button tooltip when switching chats (#11473)
* GroupChatRoster: Make scrollbar the right-most widget (#11290)
* GroupChatInviter: Don't filter by account name (#11474)
* Preview: Display webp and avif images on Windows correctly
* CertificateDialog: Display issued-to information correctly
* AccountWizard: Respect global proxy (#11452)
Gajim 1.7.3 (03 Apr 2023)
New
* Allow muting chat notifications
Improvements
* Make `gemini` URIs clickable
* Workspace menu: Always show Mark as read action
Change
* Raise nbxmpp version
Bug Fixes
* Audio Preview: Set correct pos when clicking into visualizer
* Audio Preview: Add delay before pausing on EOS (#11423)
* Flatpak: Fix drag and drop (#10370)
* GroupChatDetails: Adapt to changed icons
* Message input: Fix height for single line messages
* Update message merged state after deleting a message (#11438)
* ChatActionProcessor: Fix inserting emojis by click (#11445)
* Account preferences: Adapt to changed icons
Gajim 1.7.2 (09 Mar 2023)
Improvements
* Declare that the installer is DPI-aware
* Windows installer: Add Polish language
* Add message menu entry for deleting messages locally
* Proxies: Add 'Tor (Browser)' default proxy setting
* Windows: Add direct download for Gajim Portable updates
* Windows: Offer direct download of Gajim setup when update is available
* Select group chat after creating it (#11304)
* Don’t color log timestamps
* PEPConfig: Ask for confirmation when deleting nodes
* Improve get_recent_muc_nicks query
* Improve check for message highlight and add tests
* Tests: Use in-memory settings database
* Add audio/x-wav to default mime types
* Audio preview: Allow skipping by clicking the visualization (#11392)
Bug Fixes
* Migration: Don’t fail on color setting migration (#11426)
* HTTPUpload: Respect infinite file size limit (#11436)
* Chatstates: Remove composing timeout correctly
* Show chat notifications when chat page is not visible (#11416)
* Don't fail if contact name for MUC message is None (#11417)
* Notifications: Honor notification_preview_message setting
* Fix nickname highlight in group chats (#11413)
* Profile: Don't allow saving profile when not connected (#11401)
* GetRelativeTimeTest: Fix comparison of translated strings and off-by timezone errors
* Don't highlight message if it's an URI containing our nick (#11387)
* Nickname completion: Make sure recent nicknames list does not contain None (#11394)
* Plugins: Don't fail hard on uninstall errors (#11389)
* Start Chat: Fix wrong JID type in _start_new_chat (#11398)
Gajim 1.7.1 (08 Feb 2023)
New
* Improve KeepassXC Integration
Improvements
* MUC: Enable archiving when creating MUCs on ejabberd
Change
* Raise nbxmpp version to 4.2.0
Bug Fixes
* Apply SASLprep to passwords
* Make switching status work again
Notes
If you already used KeepassXC with Gajim, enabling the new
integration setting will trigger new entries in the password manager
Gajim 1.7.0 (03 Feb 2023)
Improvements
* Preferences: Add 0 and 25 MiB to preview size settings (#11385)
* Account wizard: Don't allow to add account twice
Change
* Port to pyproject.toml
Bug Fixes
* Fix loading localised emojis
* HTTPUpload: Don’t cache temp path (#11373)
* JingleAudio: Always resample audio before processing with webrtcdsp (#11023)
* Disable legacy ciphers in cryptography
Notes
The port to pyproject.toml brings changes about how to package Gajim.
Please read the README to find all information about metadata generation.
Gajim 1.6.1 (14 Jan 2023)
Improvements
* AdHocCommands: Refresh commands list after completing command (#11356)
* Limit message length and add FullMessageWindow
* ChatList: Improve timedelta function
* CreateGroupchatWindow: Add Advanced switch and always show address entry (#11310)
* UX: Make more text labels selectable/enable can-focus for copying (#11336)
* AccountPage: Add menu item to deny all subscription requests (#11367)
* Account menu: Add Execute Command… entry for convenience
* AccountPage: Make all account menu items available (#11329)
* AccountPage: Add menu entry for adding contacts
Change
* Raise required nbxmpp version
Bug Fixes
* Notifications: Fix rare case where Gajim displays notifications for our own messages (#11305)
* ServiceDiscoveryWindow: Fix jumping when resizing window (#11239)
* Don't fail in mark_as_unread if there are no messages (#11360)
* Profile: Fix setting avatar (#11371)
* AvatarChooser: Fix file filter for Windows
* Audio Preview: Sync clock to make short files play properly on Win
* ChatStack DnD: Add workaround for mis-fired drag-motion signal (#11226)
* AudioPreview: Make visualization fully RTL compatible again and ensure graph is always drawn
* Preview: Handle exceptions while decrypting
* Audio Visualizer: Port deprecated methods
* AudioPreview: Always format progress time as LTR
* AppPage: Differentiate between updates (Gajim/Plugins) (#11363)
* GroupChat: Display reason when group chat is destroyed
Gajim 1.6.0 (06 Jan 2023)
New
* Allow sending files by copy-pasting them from file managers
* Preview: Add audio preview controls and visualization
* Resurrect URI-specific context menus
Improvements
* Highlight the file when opening containing folder
* BaseAvatarChooserDialog: Allow all image types (#11328)
* Timestamps: Use date/time format preference in more places (#10948)
* AppPage: Show date for last update check
* Add dedicated context menu for non-specific URI types
* Restore ability to manually disambiguate JID-like addresses
* Use the unified Start/Join Chat flow for ?join links
Change
* Raise required nbxmpp version to 4.0.0
* Depend on Python 3.10
* Port to libsoup3
Bug Fixes
* CertificateBox: Format serial number in hex (#11335)
* MessageActionsBox: Restore emoji button behavior (#11350)
* Settings: Add migration for global MUC search api endpoint
* AccountWizard: Remove subscriptions after successful login (#11342)
* Audio Preview: Fix visuals on EOS while seeking
* Audio Preview: Don't let seekbar handle jump to end on EOS when user is seeking
* Commands: Attempt to parse only if message can have a command (#11341)
* Add missing PyGObject dependency to setup.cfg
* Notifications: Use correct nickname for /me messages (#11334)
* AvatarSelector: Set default crop scale to 1.0 (#11331)
* Menus: Don’t use GLib variant text format parsing (#11331)
* Fonts: Fix emoji rendering on MacOS
* Remember last folder correctly after sending file
* Preview: Don't treat multi-line message body as previewable URL
Gajim 1.5.4 (04 Dec 2022)
Improvements
* DataFormWidget: Set min width on right box (#11222)
* MUC: Add method for aborting join
* Message selection: Improve wording for deselecting messages
* Message selection: Improve styling
* Features: Add entry for Audio Preview
* Styling: Introduce URI scheme whitelisting (#11266)
* Message selection: Use date_time_format instead of time_format
* Settings: Unify timestamp settings (#10948)
* Prettify display of geographical locations
* ChatList: Scroll to top when switching workspace
* Preferences: Improve preview settings
* Chatstates: Add a timeout for the "composing" animation
* Accounts window: Use equal widths for account switch label
* VCardGrid: Linkify all URI-type fields iff they are valid URIs
* URI parsing: Detect invalid file URIs earlier
* Styling: Validate link syntax deeper and *after* parenthesis correction
* Add msg_log_id to live message events (#11263)
Change
* Dependencies: Remove pyOpenSSL, add python-cryptography
* Jingle: Remove XTLS support (#11160)
* Add FileTransferSelector as a central page for sending files (#9511)
* Block opening file:/ links by default (#11276)
Performance
* Control: Request history more efficiently
Bug Fixes
* Preview: Handle multiple simultaneous certificate verification errors
* Styling: Linkify URIs only if at the start of a word
* MessageInputTextView: Reintroduce gui_extension_point
* GUI tests: Adapt GUI tests to Gajim changes
* SSLErrorDialog: Fix test, remove OpenSSL usage
* ChatFunctionPage: Don't close control on cancelling join error (#11116)
* SearchView: Set chat type correctly for ResultRows (#11087)
* Chatstates: Switch to Chatstate.ACTIVE after timeout
* GroupchatRoster: Set visibility when hiding
* MessageActionsBox: Reintroduce gui_extension_point
* Preview: Respect MUC context for PMs (#11289)
* ConversationView: Fix scrollbar not being the right-most widget
* Preview: Stop further processing if decompression bomb detected (#11280)
* URI parsing: More robustness with geo URIs
* URI parsing: Properly unescape mailto URIs
* URI parsing: Properly unescape XMPP URIs and handle unknown query types
* MessageInputTextView: Handle is_correcting if no contact is set (#11272)
* Fix various issues with chat markers
* Plugins: Replace usage of gui_extention_point()
* CSS: Fix settings related inconsistencies
* CSS: Move overriding rules to bottom (#11269)
* Message selection: Don’t fail hard if log_line_id is None (#11263)
* Don’t fail when trying to reset last message id
Gajim 1.5.3 (31 Oct 2022)
New
* Allow to copy multiple messages
* Accounts: Add setting for default workspace (#11208)
Improvements
* Preferences: Add send_on_ctrl_enter setting (#11242)
* Add actions menu to Start Chat button (#11241)
* ExceptionDialog: Close dialog with ESC
* ChatList: Show drafts
* StartChat: Recognize input of xmpp uris
* Workspaces: Add 'Mark as read' menu item (#11198)
* Improve emoji completion
* ACE: Enable reset button only for changed values
* Avatar: Follow modernxmpps suggestions for color generation
Change
* Raise nbxmpp version
* Preferences: Add escape_key_closes to "Chat" section
* Preferences: Reorder "Chat" settings and add a "General" section
* Preferences: Move show_chatstate_in_banner to ACE settings
* Remove confirm_paste_image setting
* Remove setting to hide the chat banner
Performance
* GroupchatRoster: Don’t load roster when its hidden
* Emoji completion: Abort early if max menu entry count reached
Bug Fixes
* Disable loading of GUPnPIgd library (#11183)
* Remote: Make get_status() return correct status when offline
* Plugins: Use correct gettext import
* Make strings translatable
* Enable emoji chooser action
* AvatarBox: Only react to clicks for GroupchatContacts
* Remote: Return True for change_status
* ChatActionProcessor: Popdown on focus out event (#11254)
* Avatar placeholders: Correctly use the first grapheme as the "letter"
* Fix quoting /me messages (#11224)
* StartChat: Don’t use jid argument for global dialog
* Try leaving group chat only if account is online (#11247)
* AccountPage: Disable profile button when not connected (#11249)
* MUC: Allow changing subject if there is none (#11250)
* PluginsWindow: Fix typo in plugin tooltip
* PluginManager: Block plugins which have been integrated into Gajim (#11244)
* MessageInputTextView: Fix correction mode when switching chats (#11213)
* AdHoc: Make MultiLineLabel selectable
* Settings: Check if account is connected before trying to get context (#11243)
* Styling: Various link parsing issues (#11218#11144)
* Windows build: Remove build time package remnants (#11234)
* Send message icon: Increase line width and make icon symbolic
* Accounts: Use account label for disable confirmation
* AccountBadge: Update colors correctly
* Update account label when changing label setting (#11238)
* SearchView: Scroll to to when resetting (#11240)
* Notification: Draw avatar correctly on scale > 1 (#11229)
* Preview: Don’t fail hard when parsing fragments
* PreviewAudio: Increase update rate for seek bar (#11215)
* AccountPage: Disable Execute Command button by default (#11216)
* Client: Load trusted certificates on connect() (#11220)
* ChatList: Don’t increase in width while drag and drop
* Roster: Always show workspace when starting chat
* WorkspaceSidebar: Don't increase in width while drag and drop (#11210)
* ChatFunctionPage: React to connection changes (#11206)
* Preview: Set user-agent for session (#11205)
* SearchView: Limit displayed results to account_id of contact
* Don’t fail when disabling accounts (#11199)
Gajim 1.5.2 (08 Oct 2022)
New
* PEPConfig: Add PEP item view
* Add shortcut to restore chats after closing (#11088)
* ServerInfo: Add TLS version and cipher suite
Improvements
* XMLConsole: Apply account filter to all visible stanzas (#11193)
* Features dialog: Simplify statements on Windows
* MessageRow: Set text direction for RTL text (#11148)
* AvatarSelector: Add border to mark drag and drop zone
* Drag and drop: Highlight target areas (#11173)
* GroupChatNickCompletion: Simplify suggestions (#11155)
* MUC: Add participant menu to avatar
* StartChat: Add timeout when requesting MUC disco info
* StartChat: Pass message body from XMPP URI (#11140)
* Windows: Ellipsize body text in notifications
* Emojis: Improve shortcode usability
* Avatars: Use PangoCairo for generate_avatar (#10960)
* Emojis: Extract codepoints for all emoji variants
Change
* Raise nbxmpp version
* Show account color bar only when multiple accounts are active
Performance
* Remove queue_resize leftover from MessageTextView
* SearchView: Update calendar only if widget is visible
* SearchView: Speed up clearing of search results (#11158)
* Styling: Parse emojis for Darwin only
Bug Fixes
* Control: Load events before messages (#11129)
* Fix disabling accounts while reconnecting (#11194)
* Use custom icon for 'Send Message' action
* MessageActionsBox: Don’t fail if no contact is set while updating file actions
* Scroll to end after sending message (#10871)
* Update chat actions when account state changes (#11184)
* StatusIcon: Reset unread state correctly when using Flatpak (#11069)
* Notifications: Show correct message sender for MUC notifications (#11177)
* Discovery: Don’t allow to join top level components (#11175)
* ChatList: Show context menu in correct position (#11165)
* Styling: Allow dots in local part of email addresses
* ChatList: Set message_id correctly (#11168)
* Notifications: React to incoming group chat messages (#11161)
* When removing a chat, clear view only if it's currently loaded (#11164)
* AccountPage: Disable Ad-Hoc Commands button when offline (#11167)
* CreateGroupchatWindow: Fix Create button state when switching MUC type (#11162)
* React correctly to UserAvatar updates (#11065)
* GajimRemote: Remove not needed shebang
Gajim 1.5.1 (19 Sep 2022)
Bug Fixes
* ChatBanner: Format markup string correctly
Gajim 1.5.0 (19 Sep 2022)
CVE-2022-39835
This release fixes a vulnerability which allowed attackers to craft a XML
stanza in a way, so Gajim would accept it as message correction for messages
not originating from the attacker.
New
* Add drag and drop support for pinned chats
* Workspaces: Add shortcuts for switching
* Refactor ChatWidgets so they are only created once (#10987, #11038, #10973, #10119, #11052, #10945)
Improvements
* Preview: Improve mime type detection (#11150)
* SearchView: Add hint for search filters (#11136)
* Preview: Show left click action tooltip on icon (#11138)
* ACE: Highlight non-default values (#11120)
* XMLConsole: Use SourceView for XML input (#11121)
* Migration: Make archive migration more resilient
* Workspaces: Move chats when removing workspace (#11098)
* ChatList: Always show when switching workspace (#11108)
* MessageActionsBox: Disable encryption button if MUC is public (#10959)
* Increase contrast for message row meta elements
* StatusIcon: Use new icon for pending events
* WorkspaceSidebar: Allow removing workspace from context menu
* AccountPage: Add button for Ad-Hoc commands
* Don’t try to query avatars in MUCs which don’t allow it (#10937)
* Don’t disco MUC participants on presence
* Chatstate: Don’t make too many assumptions
* Windows: Increase default font size
* CSS: Use relative sizes for fonts
* ChatControl: Show error if encryption plugin is missing
* Store and restore running HTTP File Transfer uploads
* Add button for toggling chat list (#11035)
* ContactInfo/GroupchatDetails: Toggle icon when editing name
Change
* Raise nbxmpp version
* Raise PyGObject version (#11132)
* Add requirement for min sqlite version
* ChatBanner: Add button for managing voice requests
* Remove IPython support
* Rework ChatCommands
* Shortcuts: Use Ctrl+F for opening the search bar (#11073)
* Remove clear-chat action (Ctrl+L)
* Raise required nbxmpp version to 3.2.2
Performance
* Use Task Queue to request avatars on MUC join
Bug Fixes
* GroupchatState: Hide when we are offline
* Corrections: Don’t correct message if text has not changed (#11146)
* Make plugin usable check work on all unix/linux systems (#11134)
* MUC: Don’t ignore MUC invites when ignore_unknown_contacts is set (#11107)
* Make shortcuts more discoverable (#11122, #11127)
* Better validate message corrections
* MUC: Improve automatically adding members on invite
* Preview: Sanitize filename from disallowed chars (#11105#10752)
* Chatstates: Don’t sent chatstate delayed to ourself
* Don’t reset setting when closing single chat
* Preview: Don’t fail if thumb file already exists (#11091)
* MessageInputTextView: Account for having multiple blocks when applying style (#11015)
* ActionMenu: Correctly execute text actions if text contains underscore
* InfoMessage: Don’t escape text
* MUC: Send password and reason correctly on invite
* Preview: Reset received size before cancelling or downloading
* BlockingList: Don’t fail with placeholder address (#11084)
* ChatList: Update status for private chats correctly
* ChatList: Update avatar for all chats correctly
* GroupChat: Handle nickname changes correctly
* Roster: Add missing contact-info action
* Make switch-next-unread-tab action work
* ChatBanner: Use correct scaling for chatstates
* FileTransferRow: Don’t cancel transfer when switching chat
* ChatBanner: Don’t show phone icon for group chats
* Don’t handle message-sent even for groupchats
* ChatBanner: Display account badge again
* Make nick completion test pass
* Preview: Store last_save_dir with Save As
* Preview: Make sure the widget is not being destroyed while updating (#10920)
* Fix handling of URLs without scheme (#11059)
* GroupchatState: Call correct page for not-joined
* ChatControl: Don’t assume messages always have a resource (#11042)
Notes
* ChatCommands have been reworked. Only following commands are now available
- status
- invite
- ban
- affiliate
- kick
- role
* Ctrl+H for opening the search bar has been removed, please use the
commonly used Ctrl+F (find). The shortcut for starting a file transfer
has been dropped.
Gajim 1.4.7 (24 Jul 2022)
Improvements
* Startup: Show hint in console if Gajim is already running (#11039)
* Preview: Add setting to disable file preview (#10991)
Performance
* Roster: Don’t invalidate filter on contact update
* Roster: Sort more efficiently
Bug Fixes
* Settings migration: Don’t fail on missing proxies key (#11050)
* Chat Markers: Don’t send marker for outgoing messages (#11043)
* Main Window: Move to stored position on startup
* Preview: Allow manual download for all mime types (#11044)
* GroupchatInfo: Don’t set subject when loading from disco info (#11040)
* Preview: Hide download hint if we sent the file (#11036)
Gajim 1.4.6 (07 Jul 2022)
Improvements
* Roster: Display show value in tooltip (#11010)
* ChatActionProcessor: Improve detection of emoji shortcode start
Bug Fixes
* Flatpak: Fix display of tray icon using libappindicator (#10869)
* Remote: Console scripts need a method as entry point (#11034)
* CodeWidget: Don’t default to python for highlighting (#11012)
* ContactInfo: Preserve groups when changing contact name (#11028)
* CodeWidget: Don't highlight matching brackets (#11026)
* StatusIcon: Don’t lose new message icon on state change (#11013)
* GtkStatusIcon: Always show when Gajim has not toplevel focus
* GroupChatNickCompletion: Only process Tab press
* Notifications: Change Gdk window hints on Windows (#11008)
* Row name: Align label correctly
* StatusIcon: Logic error on activate
Gajim 1.4.5 (21 Jun 2022)
New
* Add new Shortcut for toggling the chat list
Improvements
* Preferences: Add setting for emoji shortcodes
* Disable plugin updates by Gajim on flatpak
Bug Fixes
* Use nickname provided in subscription requests everywhere
* GroupchatOutcasts: Make removing users work
* Chat: Display corrections for /me messages correctly (#10933)
* Styling: Process URIs when using /me command (#10988)
* Preview: Align link button correctly (#10997)
* MUC: Don’t fail on presence from unknown occupants (#10981)
* SystemStyleListener: Fix handling of color scheme states (#10996)
* Styling: Improve address regex
* Styling: Improve uri regex
* Styling: Parse text correctly which contains uris and addresses (#10974)
* Main: Process window shortcuts when no chat is open
* Restore minimal AdHoc module
Gajim 1.4.4 (18 Jun 2022)
New
* Add support for inputing emoji short codes
* Add freedesktop colorscheme preference support
* Add new CLI command --show
* Add new CLI command --cprofile
* Preferences: Add `Action on Close Button` setting
* Preferences: Add `Show in Taskbar` setting
* Preferences: Add D-Bus Interface setting
* Rewrite gajim-remote
* #10040 Logind: Listen to system shutdown and quit Gajim gracefully
Improvements
* CreateGroupchatWindow: Enable emoji completion for description
* CreateGroupchatWindow: Produce valid addresses from name
* Gateways: Use avatar if published
* History: Add Keep History 'Until Gajim is Closed' option
* MUC: Base invitation type on MUC type and affiliation
* Rework DBus Remote Interface
* StatusMessageSelector: Enable emoji completion
* #10908 Group chats: Ask for confirmation before leaving
* #10958 #10949 #10943 Preview: Improve layout and display errors
Performance
* #10828 Limit message size for styling
Change
* Remove remote AdHocCommands feature
* #10986 Remove ask for status settings
Bug Fixes
* Chat banner: Show phone image if last message came from a phone
* Flatpak: Determine notification backend caps with dbus
* Groupchat: Prevent automatic roster revealer toggling on join
* Make plugins_repository_enabled available via ACE
* MucJoinLeft: Align timestamp correctly
* NotificationManager: Make displaying an invitation more robust
* StatusIcon: Reliably raise/hide window
* #10900 Groupchat: don't steal active msg textbox focus
* #10913 Groupchat: Load GroupChatState widget early
* #10934 DBus: Unify presence signals
* #10938 JingleAudio: Check if webrtcdsp is available
* #10944 Groupchat: Show correct icon when toggling roster revealer
* #10950 WorkspaceDialog: Show correct settings for workspace if there is only one
* #10953 Status messages: Check for correct setting
* #10955 MessageInputTextView: Don’t remove tags for spell checking
* #10961 Workspaces: Fix image scaling
* #10965 AvatarSelector: Add fail-safes for loading images
* #10977 Limit max quote recursion
* #10978 Make drag & drop more reliable
* #10984 Preview: Don’t fail on invalid IPV6 urls
* #10985 Remote: Don’t fail on list_contacts
* #10989 Preview: Catch PIL errors while generating preview
Gajim 1.4.3 (01 Jun 2022)
Improvements
* AppPage: Show plugin update notifications
* ChatList: Add middle mouse click for closing a chat
* DirectorySearch: Use Gio.Menu, add Start Chat item
* Group chat roster: Store visibility
* Smaller Jingle file transfer widget
* Unify ContactInfo and GroupchatDetails elements width
* Windows: Change PANGOCAIRO backend to enable colored emojis
* Windows: Enable native emoji chooser
* Workspaces: Add Move to new workspace functionality
* #10812 Workspaces: Enable emoji picker
* #10876 Windows: Simplify installer
* #10905 Avatars: Render emojis correctly
Bug Fixes
* AddContact: Fix opening AdHocCommands window
* ContactInfo: Fix copying name and JID by Ctrl+C
* DirectorySearch: Correctly connect form validation
* Don’t fail on GajimPlugin equality test
* History: Don’t remove JID IDs from database
* InfoBar: Add style rule for anchors in dark mode
* Make GStreamer an optional dependency again
* Plugins: Unregister modules after calling deactivate()
* Replace user-visible strings of 'Groupchat' with 'Group Chat'
* WorkspaceDialog: Disable Remove button for last workspace
* #10903 Notifications: Show correct chat when clicking notification on Windows
* #10911 AccountsWindow: Use get_app_window to reliably access window's methods
* #10912 VCardGrid: Request minimum width
* #10921 ChatControl: Don't update AV actions for PMs
* #10922 Search: Add fail-safe for incomplete JID ID tables
* #10924 StartChat: Allow transport JIDs without successful discovery
Gajim 1.4.2 (25 May 2022)
New
......@@ -95,7 +1408,7 @@ Gajim 1.4.0 (11 May 2022)
* #8584 Display vcard-temp JABBERIDs somewhere
* #8631 Vertical tabs can not be adjusted in width in latest master
* #8742 Integrate the Appindicator plugin into Gajim
* #8745 Allow successive bookmarked MUC autojoins (in oposite to concurrent)
* #8745 Allow successive bookmarked MUC autojoins (in opposite to concurrent)
* #8849 Error when disabling an account: Account iter of <the server> could not be found
* #8897 Roster filter crashes
* #8898 Roster tree elements have wrong collapse state during and after roster filtering
......@@ -103,11 +1416,11 @@ Gajim 1.4.0 (11 May 2022)
* #9041 HTTPUpload: Add upload button to contact right-click menu
* #9046 Add a "Minimize on close" in Preferences for all MUC rooms
* #9145 Roster not showing number of contacts logged in per group
* #9164 Chatstates: Color of tab as "typing/composing" indicator get's lost on focus
* #9164 Chatstates: Color of tab as "typing/composing" indicator gets lost on focus
* #9174 Changing status results in an error
* #9202 No context menu on MUC's tab
* #9321 Cannot allow contact to see my status
* #9360 Allow disabling keyboard shorcut ctrl+L (clear chat window)
* #9360 Allow disabling keyboard shortcut ctrl+L (clear chat window)
* #9457 Add global search in History window
* #9501 Mark corrected messages (LMC) in history browser
* #9596 Add UI to search history from contact/chat window
......@@ -133,7 +1446,7 @@ Gajim 1.4.0 (11 May 2022)
* #10166 AttributeError: 'NoneType' object has no attribute 'show'
* #10205 Restoring conversation tabs fails if JID contains comma
* #10236 MUC: Error in update_actions when clicking on tray notification
* #10242 Bug with roster: Repeating error message: "too many values to unpack (exptected 2)"
* #10242 Bug with roster: Repeating error message: "too many values to unpack (expected 2)"
* #10248 logind timeout error (24) in _inhibit_sleep
* #10249 StatusIcon: Show connection lost icon when at least one account is not connected
* #10279 error after wake-up from hibernation
......@@ -141,7 +1454,7 @@ Gajim 1.4.0 (11 May 2022)
* #10450 Clicking a link in the message window can cause Gajim 1.3 to crash
* #10452 Various contact list issues
* #10455 App crashing if quit from tray in Windows
* #10461 TypeError: can only concatenate str (not "NoneType") to str when receving bare jid presence from localpart@component.domain.tld
* #10461 TypeError: can only concatenate str (not "NoneType") to str when receiving bare jid presence from localpart@component.domain.tld
* #10472 ConfirmationCheckDialog: DELETE_EVENT does not propagate checkbox state
* #10483 Don't interrupt onboarding with update dialog
* #10490 Gajim does not send XHTML in MUC
......@@ -386,7 +1699,7 @@ Gajim 1.2.1 (08 July 2020)
* ServerInfo: Display status address
* Add block and spam reporting in various places
* Roster: Allow to add contacts from `Not in contact list` group via DND
* Roster: Allow sending message to serveral groups
* Roster: Allow sending message to several groups
* Groupchat/Chat: Rework DND
* Groupchat: Display recent history from the database
......@@ -543,12 +1856,12 @@ Gajim 1.1.0-beta2 / 1.0.99.1 (13 October 2018)
* Support more media players for broadcasting the current tune
* Windows: Add a debug logging switch in preferences
* Preferences: enable/disable dark theme
* Preferences: enable/disable the MUC subject beeing shown on join
* Preferences: enable/disable the MUC subject being shown on join
* Preferences: enable/disable ascii emoji conversion
Bug fixes
* #9198 Creating new MUCs with captial letters is not possible
* #9198 Creating new MUCs with capital letters is not possible
* #9210 Error when clicking on new message indicator
* #9280 Inviting users to a MUC causes error
* #9301 Error when opening service discovery window
......@@ -581,7 +1894,7 @@ Gajim 1.1.0-beta1 / 1.0.99 (19 August 2018)
Bug fixes
* #8658 Translation doesnt work on Windows
* #8658 Translation doesn't work on Windows
* #8750 Increase time frame for duplicate search in MUCs
* #9138 Translation in Flatpak does not work
* #9140 Error when clicking on the notification of an incoming message
......@@ -642,10 +1955,10 @@ Gajim 1.0.2 (30 April 2018)
* #9055 Removing a bookmark causes error
* #9057 Avatar is deleted when updating vCard
* #9065 Account label isn't change in tooltip of notification area icon
* #9066 Placeholder text does't disappear
* #9066 Placeholder text doesn't disappear
* #9068 Missing pulseaudio in Flatpak image
* #9070 Fix History Manager search
* #9074 Proxy comobobox in accounts/connections doesn't get update after ManageProxies
* #9074 Proxy comobo-box in accounts/connections doesn't get update after ManageProxies
* #9094 problem receiving file
* #9101 Notification never autohides in gnome
......@@ -741,7 +2054,7 @@ Gajim 0.16.6 (02 October 2016)
Gajim 0.16.5 (28 December 2015)
* Improve MAM implementation
* Improve security on connexion and for roster managment
* Improve security on connection and for roster management
* Ability for emoticons to be sorted in menu
Gajim 0.16.4 (26 September 2015)
......@@ -816,7 +2129,7 @@ Gajim 0.15 (18 March 2012)
* Plugin system
* Whiteboard (via a plugin)
* Message archiving
* Stream managment
* Stream management
* IBB
* Nested roster group
* Roster filtrering
......@@ -833,7 +2146,7 @@ Gajim 0.14.3 (19 June 2011)
* Fix history viewer
* Fix closing roster window
* Prevent some erros with metacontacts
* Prevent some errors with metacontacts
Gajim 0.14.2 (07 June 2011)
......@@ -963,7 +2276,7 @@ Gajim 0.12 (17 December 2008)
* Better auto-away support
* Fix banshee support
* Quodlibet support
* Fix GSSAPI authentification
* Fix GSSAPI authentication
* Fix IPV4 filetransfer on Windows Vista when IPV6 is used too
* Fix caps usage
* Fix end to end encryption autonegotiation
......@@ -1067,7 +2380,7 @@ Gajim 0.11.2 (22 September 2007)
* Improve idle, transports support
* Enable ellipsization in roster and chatwindow
* Fixed some metacontacts problems (#2156, #2761)
* Beter support of XEP-0070 (Verifying HTTP Requests via XMPP)
* Better support of XEP-0070 (Verifying HTTP Requests via XMPP)
* Make the same height of a banner for all chat tabs
* Fix a bug with french translation and invitations (#3043)
* Fix a bug with UTF-8 and emoticons
......@@ -1107,7 +2420,7 @@ Gajim 0.11 (19 December 2006)
* Completion for "Start Chat" input dialog
* Metacontacts across accounts (#1596)
* Ability to have a different spellchecking language in each chat window. (#2383 and #746)
* Forbid to run multiple instances (but you can use differents profiles)
* Forbid to run multiple instances (but you can use different profiles)
* Ability to save avatar with right click on avatar in chat banner
* Annotations (XEP-0145)
* XHTML Support
......@@ -1115,7 +2428,7 @@ Gajim 0.11 (19 December 2006)
* Ability to operate on more than one contact at once in roster (#1514)
* Send single message to a whole group
* Delete a whole group
* Gajim now remembers if GPG encyption was enabled per contact
* Gajim now remembers if GPG encryption was enabled per contact
* Priority can be changed automatically when we change status
* Fuzzyclock support
* Mute sounds from systray menu
......@@ -1219,7 +2532,7 @@ Gajim 0.8 (18 Aug 2005)
Gajim 0.7.1 (5 Jun 2005)
* Transports icon as an option and error/mesage icon for transports
* Transports icon as an option and error/message icon for transports
* Gajim is more HIG compatible
* Editing registration information on transports
* Messages stanza without <body> element are not printed
......
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for software and other kinds of works.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS
0. Definitions.
“This License” refers to version 3 of the GNU General Public License.
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
A “covered work” means either the unmodified Program or a work based on the Program.
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
1. Source Code.
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
7. Additional Terms.
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
11. Patents.
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.
You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <https://www.gnu.org/philosophy/why-not-lgpl.html>.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for software and other kinds of works.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS
0. Definitions.
“This License” refers to version 3 of the GNU General Public License.
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
A “covered work” means either the unmodified Program or a work based on the Program.
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
1. Source Code.
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
7. Additional Terms.
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
11. Patents.
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.
You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <https://www.gnu.org/philosophy/why-not-lgpl.html>.