Compare commits
16 Commits
4b25b72b2e
...
v1.3.63
Author | SHA1 | Date | |
---|---|---|---|
c342877558 | |||
f5743cbd7b | |||
8a62597705 | |||
374721d1e5 | |||
ea6f708c6e | |||
78169dfdb1 | |||
074bfb658d | |||
989076e794 | |||
aa0d056d10 | |||
cd619b8f2a | |||
6d8358cbb9 | |||
1f3a67634f | |||
09969b644e | |||
deb7abd102 | |||
1b059c35f1 | |||
e098d71f6f |
54
.github/workflows/gitea-release.yml
vendored
54
.github/workflows/gitea-release.yml
vendored
@ -12,6 +12,8 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
@ -66,14 +68,50 @@ jobs:
|
|||||||
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
|
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
|
||||||
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
|
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Read CHANGELOG.md
|
- name: Generate Release Notes
|
||||||
id: changelog
|
id: release_notes
|
||||||
run: |
|
run: |
|
||||||
VERSION=${{ steps.get_version.outputs.VERSION }}
|
# Get all tags sorted by version
|
||||||
CHANGELOG=$(awk "/## \\[$VERSION\\]/{p=1;print;next} /## \\[/{p=0} p" CHANGELOG.md)
|
TAGS=($(git tag -l 'v*' --sort=-v:refname))
|
||||||
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
|
CURRENT_TAG="${TAGS[0]}"
|
||||||
echo "$CHANGELOG" >> $GITHUB_OUTPUT
|
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
if [ ${#TAGS[@]} -gt 1 ]; then
|
||||||
|
PREVIOUS_TAG="${TAGS[1]}"
|
||||||
|
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "Changes since $PREVIOUS_TAG:" >> $GITHUB_OUTPUT
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Get commits between previous and current tag
|
||||||
|
echo "### Added" >> $GITHUB_OUTPUT
|
||||||
|
git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:%s | grep -iE '^(feat|add|new)' | sed 's/^feat: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Fixed" >> $GITHUB_OUTPUT
|
||||||
|
git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:%s | grep -iE '^fix' | sed 's/^fix: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Changed" >> $GITHUB_OUTPUT
|
||||||
|
git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:%s | grep -ivE '^(feat|fix|add|new)' | sed 's/^/- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
# First release or no previous tag
|
||||||
|
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "Initial Release" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Add all commits for initial release
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
echo "### Added" >> $GITHUB_OUTPUT
|
||||||
|
git log --pretty=format:%s | grep -iE '^(feat|add|new)' | sed 's/^feat: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Fixed" >> $GITHUB_OUTPUT
|
||||||
|
git log --pretty=format:%s | grep -iE '^fix' | sed 's/^fix: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Changed" >> $GITHUB_OUTPUT
|
||||||
|
git log --pretty=format:%s | grep -ivE '^(feat|fix|add|new)' | sed 's/^/- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Determine Gitea URL
|
- name: Determine Gitea URL
|
||||||
id: gitea_url
|
id: gitea_url
|
||||||
@ -122,7 +160,7 @@ jobs:
|
|||||||
|
|
||||||
# Erstelle zuerst den Release ohne Dateien
|
# Erstelle zuerst den Release ohne Dateien
|
||||||
echo "Debug: Creating release..."
|
echo "Debug: Creating release..."
|
||||||
RELEASE_DATA="{\"tag_name\":\"v${VERSION}\",\"name\":\"v${VERSION}\",\"body\":\"${{ steps.changelog.outputs.CHANGES }}\"}"
|
RELEASE_DATA="{\"tag_name\":\"v${VERSION}\",\"name\":\"v${VERSION}\",\"body\":\"${{ steps.release_notes.outputs.CHANGES }}\"}"
|
||||||
|
|
||||||
RELEASE_RESPONSE=$(curl -s -w "\n%{http_code}" \
|
RELEASE_RESPONSE=$(curl -s -w "\n%{http_code}" \
|
||||||
-X POST \
|
-X POST \
|
||||||
|
52
.github/workflows/github-release.yml
vendored
52
.github/workflows/github-release.yml
vendored
@ -73,14 +73,50 @@ jobs:
|
|||||||
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
|
VERSION=$(grep '^version = ' platformio.ini | cut -d'"' -f2)
|
||||||
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
|
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Read CHANGELOG.md
|
- name: Generate Release Notes
|
||||||
id: changelog
|
id: release_notes
|
||||||
run: |
|
run: |
|
||||||
VERSION=${{ steps.get_version.outputs.VERSION }}
|
# Get all tags sorted by version
|
||||||
CHANGELOG=$(awk "/## \\[$VERSION\\]/{p=1;print;next} /## \\[/{p=0} p" CHANGELOG.md)
|
TAGS=($(git tag -l 'v*' --sort=-v:refname))
|
||||||
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
|
CURRENT_TAG="${TAGS[0]}"
|
||||||
echo "$CHANGELOG" >> $GITHUB_OUTPUT
|
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
if [ ${#TAGS[@]} -gt 1 ]; then
|
||||||
|
PREVIOUS_TAG="${TAGS[1]}"
|
||||||
|
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "Changes since $PREVIOUS_TAG:" >> $GITHUB_OUTPUT
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Get commits between previous and current tag
|
||||||
|
echo "### Added" >> $GITHUB_OUTPUT
|
||||||
|
git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:%s | grep -iE '^(feat|add|new)' | sed 's/^feat: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Fixed" >> $GITHUB_OUTPUT
|
||||||
|
git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:%s | grep -iE '^fix' | sed 's/^fix: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Changed" >> $GITHUB_OUTPUT
|
||||||
|
git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:%s | grep -ivE '^(feat|fix|add|new)' | sed 's/^/- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
# First release or no previous tag
|
||||||
|
echo "CHANGES<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "Initial Release" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Add all commits for initial release
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
echo "### Added" >> $GITHUB_OUTPUT
|
||||||
|
git log --pretty=format:%s | grep -iE '^(feat|add|new)' | sed 's/^feat: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Fixed" >> $GITHUB_OUTPUT
|
||||||
|
git log --pretty=format:%s | grep -iE '^fix' | sed 's/^fix: /- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "### Changed" >> $GITHUB_OUTPUT
|
||||||
|
git log --pretty=format:%s | grep -ivE '^(feat|fix|add|new)' | sed 's/^/- /' >> $GITHUB_OUTPUT || true
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Create GitHub Release
|
- name: Create GitHub Release
|
||||||
env:
|
env:
|
||||||
@ -110,7 +146,7 @@ jobs:
|
|||||||
if [ -n "$FILES_TO_UPLOAD" ]; then
|
if [ -n "$FILES_TO_UPLOAD" ]; then
|
||||||
gh release create "v${VERSION}" \
|
gh release create "v${VERSION}" \
|
||||||
--title "Release ${VERSION}" \
|
--title "Release ${VERSION}" \
|
||||||
--notes "${{ steps.changelog.outputs.CHANGES }}" \
|
--notes "${{ steps.release_notes.outputs.CHANGES }}" \
|
||||||
$FILES_TO_UPLOAD
|
$FILES_TO_UPLOAD
|
||||||
else
|
else
|
||||||
echo "Error: No files found to upload"
|
echo "Error: No files found to upload"
|
||||||
|
43
CHANGELOG.md
43
CHANGELOG.md
@ -1,5 +1,48 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [1.3.63] - 2025-02-22
|
||||||
|
### Added
|
||||||
|
- update update-form background and add glass border effect
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- update webpages for version v1.3.63
|
||||||
|
- update release note generation for initial release handling
|
||||||
|
|
||||||
|
|
||||||
|
## [1.3.62] - 2025-02-22
|
||||||
|
### Changed
|
||||||
|
- update webpages for version v1.3.62
|
||||||
|
- update background colors and improve layout for update sections
|
||||||
|
|
||||||
|
|
||||||
|
## [1.3.61] - 2025-02-22
|
||||||
|
### Added
|
||||||
|
- update release notes generation to use previous tag for changes
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- update webpages for version v1.3.61
|
||||||
|
|
||||||
|
|
||||||
|
## [1.3.60] - 2025-02-22
|
||||||
|
### Added
|
||||||
|
- remove automatic git push from changelog update script
|
||||||
|
- implement release notes generation with categorized changes since last tag
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- update webpages for version v1.3.60
|
||||||
|
|
||||||
|
|
||||||
|
## [1.3.59] - 2025-02-22
|
||||||
|
### Added
|
||||||
|
- implement enhanced update progress handling and WebSocket notifications
|
||||||
|
- improve update progress reporting and enhance WebSocket notifications
|
||||||
|
- enhance update progress handling and add WebSocket closure notification
|
||||||
|
- implement WebSocket for update progress and enhance update response handling
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- update webpages for version v1.3.59
|
||||||
|
|
||||||
|
|
||||||
## [1.3.58] - 2025-02-22
|
## [1.3.58] - 2025-02-22
|
||||||
### Added
|
### Added
|
||||||
- implement backup and restore functionality for Bambu credentials and Spoolman URL
|
- implement backup and restore functionality for Bambu credentials and Spoolman URL
|
||||||
|
@ -1051,9 +1051,10 @@ input[type="submit"]:disabled,
|
|||||||
}
|
}
|
||||||
.update-form {
|
.update-form {
|
||||||
background: var(--primary-color);
|
background: var(--primary-color);
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);
|
||||||
|
border: var(--glass-border);
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: 400px;
|
width: 400px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@ -1064,7 +1065,7 @@ input[type="submit"]:disabled,
|
|||||||
padding: 8px;
|
padding: 8px;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: white;
|
background-color: #4CAF50;
|
||||||
}
|
}
|
||||||
.update-form input[type="submit"] {
|
.update-form input[type="submit"] {
|
||||||
background-color: #4CAF50;
|
background-color: #4CAF50;
|
||||||
@ -1086,10 +1087,66 @@ input[type="submit"]:disabled,
|
|||||||
.warning {
|
.warning {
|
||||||
background-color: var(--primary-color);
|
background-color: var(--primary-color);
|
||||||
border: 1px solid #ffe0b2;
|
border: 1px solid #ffe0b2;
|
||||||
color: white;
|
|
||||||
padding: 15px;
|
|
||||||
margin: 20px auto;
|
margin: 20px auto;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
max-width: 600px;
|
max-width: 600px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
color: #e65100;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.update-options {
|
||||||
|
display: flex;
|
||||||
|
gap: 2rem;
|
||||||
|
margin: 2rem 0;
|
||||||
|
}
|
||||||
|
.update-section {
|
||||||
|
flex: 1;
|
||||||
|
background: var(--background-green);
|
||||||
|
padding: 1.5rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
.update-section h2 {
|
||||||
|
margin-top: 0;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.update-section p {
|
||||||
|
color: #666;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.progress-container {
|
||||||
|
margin: 20px 0;
|
||||||
|
background: #f0f0f0;
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.progress-bar {
|
||||||
|
width: 0;
|
||||||
|
height: 20px;
|
||||||
|
background: #4CAF50;
|
||||||
|
transition: width 0.3s ease-in-out;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 20px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.status {
|
||||||
|
margin-top: 20px;
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.status.success {
|
||||||
|
background: #e8f5e9;
|
||||||
|
color: #2e7d32;
|
||||||
|
}
|
||||||
|
.status.error {
|
||||||
|
background: #ffebee;
|
||||||
|
color: #c62828;
|
||||||
|
}
|
||||||
|
.warning {
|
||||||
|
background: #fff3e0;
|
||||||
|
color: #e65100;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-bottom: 20px;
|
||||||
}
|
}
|
@ -86,64 +86,6 @@
|
|||||||
<div class="status"></div>
|
<div class="status"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
|
||||||
.update-options {
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
margin: 2rem 0;
|
|
||||||
}
|
|
||||||
.update-section {
|
|
||||||
flex: 1;
|
|
||||||
background: #f5f5f5;
|
|
||||||
padding: 1.5rem;
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
.update-section h2 {
|
|
||||||
margin-top: 0;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
.update-section p {
|
|
||||||
color: #666;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
.progress-container {
|
|
||||||
margin: 20px 0;
|
|
||||||
background: #f0f0f0;
|
|
||||||
border-radius: 4px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.progress-bar {
|
|
||||||
width: 0;
|
|
||||||
height: 20px;
|
|
||||||
background: #4CAF50;
|
|
||||||
transition: width 0.3s ease-in-out;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 20px;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
.status {
|
|
||||||
margin-top: 20px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 4px;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.status.success {
|
|
||||||
background: #e8f5e9;
|
|
||||||
color: #2e7d32;
|
|
||||||
}
|
|
||||||
.status.error {
|
|
||||||
background: #ffebee;
|
|
||||||
color: #c62828;
|
|
||||||
}
|
|
||||||
.warning {
|
|
||||||
background: #fff3e0;
|
|
||||||
color: #e65100;
|
|
||||||
padding: 15px;
|
|
||||||
border-radius: 4px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Hide status indicators during update
|
// Hide status indicators during update
|
||||||
const statusContainer = document.querySelector('.status-container');
|
const statusContainer = document.querySelector('.status-container');
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
version = "1.3.58"
|
version = "1.3.63"
|
||||||
|
|
||||||
#test
|
#test
|
||||||
|
|
||||||
|
@ -64,29 +64,10 @@ def get_changes_from_git():
|
|||||||
|
|
||||||
return changes
|
return changes
|
||||||
|
|
||||||
def push_changes(version):
|
|
||||||
"""Push changes to upstream"""
|
|
||||||
try:
|
|
||||||
# Stage the CHANGELOG.md
|
|
||||||
subprocess.run(['git', 'add', 'CHANGELOG.md'], check=True)
|
|
||||||
|
|
||||||
# Commit the changelog
|
|
||||||
commit_msg = f"docs: update changelog for version {version}"
|
|
||||||
subprocess.run(['git', 'commit', '-m', commit_msg], check=True)
|
|
||||||
|
|
||||||
# Push to origin (local)
|
|
||||||
subprocess.run(['git', 'push', 'origin'], check=True)
|
|
||||||
print("Successfully pushed to origin")
|
|
||||||
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print(f"Error during git operations: {e}")
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def update_changelog():
|
def update_changelog():
|
||||||
print("Starting changelog update...") # Add this line
|
print("Starting changelog update...")
|
||||||
version = get_version()
|
version = get_version()
|
||||||
print(f"Current version: {version}") # Add this line
|
print(f"Current version: {version}")
|
||||||
today = datetime.now().strftime('%Y-%m-%d')
|
today = datetime.now().strftime('%Y-%m-%d')
|
||||||
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
@ -111,7 +92,7 @@ def update_changelog():
|
|||||||
if not os.path.exists(changelog_path):
|
if not os.path.exists(changelog_path):
|
||||||
with open(changelog_path, 'w') as f:
|
with open(changelog_path, 'w') as f:
|
||||||
f.write(f"# Changelog\n\n{changelog_entry}")
|
f.write(f"# Changelog\n\n{changelog_entry}")
|
||||||
push_changes(version)
|
print(f"Created new changelog file with version {version}")
|
||||||
else:
|
else:
|
||||||
with open(changelog_path, 'r') as f:
|
with open(changelog_path, 'r') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
@ -120,7 +101,7 @@ def update_changelog():
|
|||||||
updated_content = content.replace("# Changelog\n", f"# Changelog\n\n{changelog_entry}")
|
updated_content = content.replace("# Changelog\n", f"# Changelog\n\n{changelog_entry}")
|
||||||
with open(changelog_path, 'w') as f:
|
with open(changelog_path, 'w') as f:
|
||||||
f.write(updated_content)
|
f.write(updated_content)
|
||||||
push_changes(version)
|
print(f"Added new version {version} to changelog")
|
||||||
else:
|
else:
|
||||||
# Version existiert bereits, aktualisiere die bestehenden Einträge
|
# Version existiert bereits, aktualisiere die bestehenden Einträge
|
||||||
version_pattern = f"## \\[{version}\\] - \\d{{4}}-\\d{{2}}-\\d{{2}}"
|
version_pattern = f"## \\[{version}\\] - \\d{{4}}-\\d{{2}}-\\d{{2}}"
|
||||||
@ -143,7 +124,6 @@ def update_changelog():
|
|||||||
|
|
||||||
with open(changelog_path, 'w') as f:
|
with open(changelog_path, 'w') as f:
|
||||||
f.write(updated_content)
|
f.write(updated_content)
|
||||||
push_changes(version)
|
|
||||||
print(f"Updated entries for version {version}")
|
print(f"Updated entries for version {version}")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Reference in New Issue
Block a user