# diffmanifests
[](https://pypi.org/project/diffmanifests/)
[](https://coveralls.io/github/craftslab/diffmanifests?branch=master)
[](https://github.com/craftslab/diffmanifests/blob/master/LICENSE)
*diffmanifests* is a tool used to see deeper differences between manifests via Gerrit & Gitiles API.
## Requirement
- Python >= 3.7
## Install
```bash
pip install diffmanifests
```
## Update
```bash
pip install diffmanifests --upgrade
```
## Run
```bash
diffmanifests --config-file config.json --manifest1-file manifest1.xml --manifest2-file manifest2.xml --output-file output.json
```
## Settings
*Diff Manifests* parameters can be set in the directory [config](https://github.com/craftslab/diffmanifests/blob/master/diffmanifests/config).
An example of configuration in [config.json](https://github.com/craftslab/diffmanifests/blob/master/diffmanifests/config/config.json):
```json
{
"gerrit": {
"pass": "pass",
"url": "http://localhost:80",
"user": "user"
},
"gitiles": {
"pass": "pass",
"retry": 1,
"timeout": -1,
"url": "http://localhost:80",
"user": "user"
}
}
```
## Features
*Diff Manifests* supports the following capabilities:
### 📊 Manifest Comparison
Compare commit 2 with commit 1 in diagram A/B/C to identify changes between manifest versions.

### 🏷️ Hashtags Support
The tool includes comprehensive support for querying changes with hashtags from the Gerrit REST API v3.12.1. This feature enhances change tracking and categorization.
**Key Benefits:**
- Automatic hashtag extraction from Gerrit changes
- Enhanced change categorization and filtering
- Better integration with Gerrit workflows
- Graceful fallback for changes without hashtags
**Output Structure:**
Each commit in the output JSON now includes a `hashtags` field containing an array of hashtags:
```json
{
"author": "Developer Name <dev@example.com>",
"branch": "master",
"change": "https://gerrit.example.com/c/12345",
"commit": "abc123def456789...",
"committer": "Developer Name <dev@example.com>",
"date": "2025-08-20 12:00:00 +0000",
"diff": "ADD COMMIT",
"hashtags": ["security", "cve", "bugfix"],
"message": "Fix security vulnerability CVE-2025-1234",
"repo": "platform/frameworks/base",
"topic": "security-fix",
"url": "https://android.googlesource.com/platform/frameworks/base/+/abc123def456789"
}
```
**Examples of hashtag usage:**
- `["feature", "ui", "enhancement"]` - New UI features
- `["bugfix", "critical"]` - Critical bug fixes
- `["security", "cve"]` - Security-related changes
- `[]` - Changes without hashtags (empty array)
**Technical Details:**
- Hashtags are retrieved using the [Gerrit REST API ChangeInfo entity](https://gerrit-documentation.storage.googleapis.com/Documentation/3.12.1/rest-api-changes.html#change-info)
- Automatic error handling ensures stable operation even when hashtags are unavailable
- Backward compatibility maintained for existing workflows
## License
Project License can be found [here](https://github.com/craftslab/diffmanifests/blob/master/LICENSE).
## Reference
[git-repo/subcmds/diffmanifests](https://gerrit.googlesource.com/git-repo/+/master/subcmds/diffmanifests.py)
Raw data
{
"_id": null,
"home_page": "https://github.com/craftslab/diffmanifests",
"name": "diffmanifests",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "diff, manifests, gitiles, api",
"author": "Jia Jia",
"author_email": "angersax@sina.com",
"download_url": "https://files.pythonhosted.org/packages/ba/c8/8b613d424fa0f76cee9a0e88aff8c5d8e7f843803273a1bb2375df3c010c/diffmanifests-3.3.3.tar.gz",
"platform": null,
"description": "# diffmanifests\n\n[](https://pypi.org/project/diffmanifests/)\n[](https://coveralls.io/github/craftslab/diffmanifests?branch=master)\n[](https://github.com/craftslab/diffmanifests/blob/master/LICENSE)\n\n\n\n*diffmanifests* is a tool used to see deeper differences between manifests via Gerrit & Gitiles API.\n\n\n\n## Requirement\n\n- Python >= 3.7\n\n\n\n## Install\n\n```bash\npip install diffmanifests\n```\n\n\n\n## Update\n\n```bash\npip install diffmanifests --upgrade\n```\n\n\n\n## Run\n\n```bash\ndiffmanifests --config-file config.json --manifest1-file manifest1.xml --manifest2-file manifest2.xml --output-file output.json\n```\n\n\n\n## Settings\n\n*Diff Manifests* parameters can be set in the directory [config](https://github.com/craftslab/diffmanifests/blob/master/diffmanifests/config).\n\nAn example of configuration in [config.json](https://github.com/craftslab/diffmanifests/blob/master/diffmanifests/config/config.json):\n\n```json\n{\n \"gerrit\": {\n \"pass\": \"pass\",\n \"url\": \"http://localhost:80\",\n \"user\": \"user\"\n },\n \"gitiles\": {\n \"pass\": \"pass\",\n \"retry\": 1,\n \"timeout\": -1,\n \"url\": \"http://localhost:80\",\n \"user\": \"user\"\n }\n}\n```\n\n\n\n## Features\n\n*Diff Manifests* supports the following capabilities:\n\n### \ud83d\udcca Manifest Comparison\n\nCompare commit 2 with commit 1 in diagram A/B/C to identify changes between manifest versions.\n\n\n\n\n\n### \ud83c\udff7\ufe0f Hashtags Support\n\nThe tool includes comprehensive support for querying changes with hashtags from the Gerrit REST API v3.12.1. This feature enhances change tracking and categorization.\n\n**Key Benefits:**\n\n- Automatic hashtag extraction from Gerrit changes\n- Enhanced change categorization and filtering\n- Better integration with Gerrit workflows\n- Graceful fallback for changes without hashtags\n\n**Output Structure:**\n\nEach commit in the output JSON now includes a `hashtags` field containing an array of hashtags:\n\n```json\n{\n \"author\": \"Developer Name <dev@example.com>\",\n \"branch\": \"master\",\n \"change\": \"https://gerrit.example.com/c/12345\",\n \"commit\": \"abc123def456789...\",\n \"committer\": \"Developer Name <dev@example.com>\",\n \"date\": \"2025-08-20 12:00:00 +0000\",\n \"diff\": \"ADD COMMIT\",\n \"hashtags\": [\"security\", \"cve\", \"bugfix\"],\n \"message\": \"Fix security vulnerability CVE-2025-1234\",\n \"repo\": \"platform/frameworks/base\",\n \"topic\": \"security-fix\",\n \"url\": \"https://android.googlesource.com/platform/frameworks/base/+/abc123def456789\"\n}\n```\n\n**Examples of hashtag usage:**\n\n- `[\"feature\", \"ui\", \"enhancement\"]` - New UI features\n- `[\"bugfix\", \"critical\"]` - Critical bug fixes\n- `[\"security\", \"cve\"]` - Security-related changes\n- `[]` - Changes without hashtags (empty array)\n\n**Technical Details:**\n\n- Hashtags are retrieved using the [Gerrit REST API ChangeInfo entity](https://gerrit-documentation.storage.googleapis.com/Documentation/3.12.1/rest-api-changes.html#change-info)\n- Automatic error handling ensures stable operation even when hashtags are unavailable\n- Backward compatibility maintained for existing workflows\n\n\n\n## License\n\nProject License can be found [here](https://github.com/craftslab/diffmanifests/blob/master/LICENSE).\n\n\n\n## Reference\n\n[git-repo/subcmds/diffmanifests](https://gerrit.googlesource.com/git-repo/+/master/subcmds/diffmanifests.py)\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Diff Manifests via Gitiles API",
"version": "3.3.3",
"project_urls": {
"Download": "https://github.com/craftslab/diffmanifests/archive/v3.3.3.tar.gz",
"Homepage": "https://github.com/craftslab/diffmanifests"
},
"split_keywords": [
"diff",
" manifests",
" gitiles",
" api"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "8d81e37a03727e79c191b64e6704fdba75717d71792679b0796cf7cef92cb22d",
"md5": "aed584b8c130c43cdbd9b858847dffc8",
"sha256": "6cb55d0a85e69ef7f241d64bc394b7d3aa1a8159d90dec5f7e440f6631f4900d"
},
"downloads": -1,
"filename": "diffmanifests-3.3.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "aed584b8c130c43cdbd9b858847dffc8",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 17801,
"upload_time": "2025-08-20T08:24:58",
"upload_time_iso_8601": "2025-08-20T08:24:58.244838Z",
"url": "https://files.pythonhosted.org/packages/8d/81/e37a03727e79c191b64e6704fdba75717d71792679b0796cf7cef92cb22d/diffmanifests-3.3.3-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bac88b613d424fa0f76cee9a0e88aff8c5d8e7f843803273a1bb2375df3c010c",
"md5": "94f7a324e1a796a14a62124d7c378174",
"sha256": "a2bc3ca648a243fc23b813af0beb6cafa67321186e628b1b1021be8ddb1045d5"
},
"downloads": -1,
"filename": "diffmanifests-3.3.3.tar.gz",
"has_sig": false,
"md5_digest": "94f7a324e1a796a14a62124d7c378174",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 16095,
"upload_time": "2025-08-20T08:24:59",
"upload_time_iso_8601": "2025-08-20T08:24:59.484919Z",
"url": "https://files.pythonhosted.org/packages/ba/c8/8b613d424fa0f76cee9a0e88aff8c5d8e7f843803273a1bb2375df3c010c/diffmanifests-3.3.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-20 08:24:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "craftslab",
"github_project": "diffmanifests",
"travis_ci": true,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "colorama",
"specs": []
},
{
"name": "coverage",
"specs": []
},
{
"name": "coveralls",
"specs": []
},
{
"name": "openpyxl",
"specs": []
},
{
"name": "pytest",
"specs": []
},
{
"name": "requests",
"specs": []
},
{
"name": "setuptools",
"specs": []
},
{
"name": "twine",
"specs": []
},
{
"name": "wheel",
"specs": []
},
{
"name": "xmltodict",
"specs": []
}
],
"tox": true,
"lcname": "diffmanifests"
}