svneverever


Namesvneverever JSON
Version 1.7.2 PyPI version JSON
download
home_pagehttps://github.com/hartwork/svneverever
SummaryTool collecting path entries across SVN history
upload_time2023-06-19 10:39:40
maintainer
docs_urlNone
authorSebastian Pipping
requires_python>=3.7
licenseGPL v3 or later
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)


# About
**svneverever** helps you inspect the structure of a SVN repository and the changes made to it over time. Its most common use is in combination with [svn-all-fast-export](https://github.com/svn-all-fast-export/svn2git) (or "KDE's svn2git" if you wish).


# Installation

## Dependencies
**svneverever** requires Python 3.7 or higher
and [PySVN](https://pysvn.sourceforge.io/)
(the one on SourceForge, not the one on PyPI).
If you want to install **svneverever** with **pip** you need a few additional packages.
For Debian/Ubuntu the following should work:

```console
# sudo apt install python3-svn python3-pip
```

## System package manager
[Some distributions](https://repology.org/projects/?search=svneverever) offer a native package for **svneverever**:
- [Arch AUR](https://aur.archlinux.org/packages/python-svneverever/)
- [Funtoo](https://github.com/funtoo/dev-kit/tree/1.4-release/dev-vcs/svneverever)
- [Gentoo](https://packages.gentoo.org/packages/dev-vcs/svneverever)
- [openSUSE](https://software.opensuse.org/package/python-svneverever)

## pip
Install with pip as user to avoid messes with Python system files.
```console
# pip install --user svneverever
```

## From source
```console
# git clone https://github.com/hartwork/svneverever.git
# cd svneverever
# python3 setup.py install --user
# echo 'export PATH="${HOME}/.local/bin:${PATH}"' >> ~/.bashrc
```

# Usage
**svneverever** needs the "server-side" of the repository with full history. There are two ways to obtain this. Let's take the SVN history of [headphone effect library bs2b](http://bs2b.sourceforge.net/) as an example.

The first way is to directly point **svneverever** to the server `svneverever svn://svn.code.sf.net/p/bs2b/code/`. However this is slow and it puts a lot of stress on the server, and will be little fun to run multiple times.

The second and recommended method is first downloading the history with
`svnrdump dump` (that comes with Subversion >=1.7) or [`rsvndump`](https://github.com/jgehring/rsvndump) (with a slightly [different feature set](https://rsvndump.sourceforge.io/) and supporting older versions of Subversion).
For this method we first need to use `svnadmin` to create an empty repository and then load the output of svnrdump/rsvndump into it. This can be done in the following way:

## With `svnrdump dump`

```console
# svnadmin create bs2b_svn_store

# time sh -c 'svnrdump dump svn://svn.code.sf.net/p/bs2b/code/ | svnadmin load bs2b_svn_store/'
[..]
real    0m3.008s
user    0m0.309s
sys     0m0.235s
```

## With `rsvndump`

```console
# svnadmin create bs2b_svn_store

# time sh -c 'rsvndump svn://svn.code.sf.net/p/bs2b/code/ | svnadmin load bs2b_svn_store/'
[..]
real    2m54.403s
user    0m1.003s
sys     0m1.300s
```

The output can now be obtained by pointing **svneverver** to the svn store directory `bs2b_svn_store`.

```console
# svneverever --no-progress bs2b_svn_store/
```

## Analyzing the output
The output of the direct method or the **rsvndump** method will be the same and looks like this:

```console
Analyzing 175 revisions...

(  1; 175)  /branches
( 66;  76)      /libbs2b-config-header
                    [..]
(  1; 175)  /tags
(109; 175)      /description
                    [..]
( 46; 175)      /libbs2b
                    [..]
( 28;  46)      /libbs2b-2.2.1
                    [..]
( 31; 175)      /plugins
                    [..]
(  1; 175)  /trunk
( 80; 175)      /description
( 80; 175)          /img
(  2; 175)      /libbs2b
(  2; 175)          /doc
(  2;  80)              /img
(  2;   6)              /src
(  4; 175)          /m4
(  2; 175)          /src
(  2; 175)          /win32
(  2; 175)              /bs2bconvert
(  2; 175)              /bs2bstream
(  2; 175)              /examples
(  2; 175)              /sndfile
(  2; 175)      /plugins
( 38; 175)          /audacious
( 38; 175)              /m4
( 38; 175)              /src
( 24; 175)          /foobar2000
(143; 175)          /ladspa
(144; 175)              /m4
(143; 175)              /src
( 39; 175)          /qmmp
(  2; 175)          /vst
(  2; 175)              /src
(  2; 175)                  /resources
(  2; 175)              /win32
(117; 175)          /winamp
(  2; 175)          /xmms
( 12; 175)              /m4
( 12; 175)              /src
```

The ranges on the left indicate at what revision folders appeared first and got deleted latest.

You can see a few things in this output:
* That a branch called `libbs2b-config-header` got deleted at revision 76.
* In which order plug-ins in `plugins` appeared over time.
* That tag `libbs2b-2.2.1` was deleted at the same revision that a tag folder `libbs2b` appeared.

The last item we can verify to see if it was _actually_ moved into that tag subfolder.

```console
# svneverever --no-progress --tags --flatten bs2b_svn_store/ | grep '2.2.1$'
Analyzing 175 revisions...

(110; 175)  /tags/description/2.2.1
( 47; 175)  /tags/libbs2b/2.2.1
( 28;  46)  /tags/libbs2b-2.2.1
```

Next I have a look at who the committers where, when they joined or left and how many commits the did (though that last number is of limited value). This can help to write an identity map for svn2git.

```console
# svneverever --no-progress --committers bs2b_svn_store/
Analyzing 175 revisions...

 81 (  1; 174)  boris_mikhaylov
 94 (  4; 175)  hartwork
```

# `--help` output
```console
# svneverever --help
usage: svneverever [-h] [--version] [--committers] [--no-numbers]
                   [--no-progress] [--non-interactive] [--tags] [--branches]
                   [--no-dots] [--depth DEPTH] [--flatten]
                   [--unknown-committer NAME]
                   REPOSITORY

Collects path entries across SVN history

positional arguments:
  REPOSITORY            Path or URI to SVN repository

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit

mode selection arguments:
  --committers          Collect committer names instead of path information
                        (default: disabled)

common arguments:
  --no-numbers          Hide numbers, e.g. revision ranges (default: disabled)
  --no-progress         Hide progress bar (default: disabled)
  --non-interactive     Will not ask for input (e.g. login credentials) if
                        required (default: ask if required)

path tree mode arguments:
  --tags                Show content of tag folders (default: disabled)
  --branches            Show content of branch folders (default: disabled)
  --no-dots             Hide "[..]" omission marker (default: disabled)
  --depth DEPTH         Maximum depth to print (starting at 1)
  --flatten             Flatten tree (default: disabled)

committer mode arguments:
  --unknown-committer NAME
                        Committer name to use for commits without a proper
                        svn:author property (default: "<unknown>")

Please report bugs at https://github.com/hartwork/svneverever.  Thank you!
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/hartwork/svneverever",
    "name": "svneverever",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "",
    "author": "Sebastian Pipping",
    "author_email": "sebastian@pipping.org",
    "download_url": "https://files.pythonhosted.org/packages/ad/87/a6d0a321aa383081d22916431e63880f4dc1f260c65f9019ce3f701e2a70/svneverever-1.7.2.tar.gz",
    "platform": null,
    "description": "[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)\n\n\n# About\n**svneverever** helps you inspect the structure of a SVN repository and the changes made to it over time. Its most common use is in combination with [svn-all-fast-export](https://github.com/svn-all-fast-export/svn2git) (or \"KDE's svn2git\" if you wish).\n\n\n# Installation\n\n## Dependencies\n**svneverever** requires Python 3.7 or higher\nand [PySVN](https://pysvn.sourceforge.io/)\n(the one on SourceForge, not the one on PyPI).\nIf you want to install **svneverever** with **pip** you need a few additional packages.\nFor Debian/Ubuntu the following should work:\n\n```console\n# sudo apt install python3-svn python3-pip\n```\n\n## System package manager\n[Some distributions](https://repology.org/projects/?search=svneverever) offer a native package for **svneverever**:\n- [Arch AUR](https://aur.archlinux.org/packages/python-svneverever/)\n- [Funtoo](https://github.com/funtoo/dev-kit/tree/1.4-release/dev-vcs/svneverever)\n- [Gentoo](https://packages.gentoo.org/packages/dev-vcs/svneverever)\n- [openSUSE](https://software.opensuse.org/package/python-svneverever)\n\n## pip\nInstall with pip as user to avoid messes with Python system files.\n```console\n# pip install --user svneverever\n```\n\n## From source\n```console\n# git clone https://github.com/hartwork/svneverever.git\n# cd svneverever\n# python3 setup.py install --user\n# echo 'export PATH=\"${HOME}/.local/bin:${PATH}\"' >> ~/.bashrc\n```\n\n# Usage\n**svneverever** needs the \"server-side\" of the repository with full history. There are two ways to obtain this. Let's take the SVN history of [headphone effect library bs2b](http://bs2b.sourceforge.net/) as an example.\n\nThe first way is to directly point **svneverever** to the server `svneverever svn://svn.code.sf.net/p/bs2b/code/`. However this is slow and it puts a lot of stress on the server, and will be little fun to run multiple times.\n\nThe second and recommended method is first downloading the history with\n`svnrdump dump` (that comes with Subversion >=1.7) or [`rsvndump`](https://github.com/jgehring/rsvndump) (with a slightly [different feature set](https://rsvndump.sourceforge.io/) and supporting older versions of Subversion).\nFor this method we first need to use `svnadmin` to create an empty repository and then load the output of svnrdump/rsvndump into it. This can be done in the following way:\n\n## With `svnrdump dump`\n\n```console\n# svnadmin create bs2b_svn_store\n\n# time sh -c 'svnrdump dump svn://svn.code.sf.net/p/bs2b/code/ | svnadmin load bs2b_svn_store/'\n[..]\nreal    0m3.008s\nuser    0m0.309s\nsys     0m0.235s\n```\n\n## With `rsvndump`\n\n```console\n# svnadmin create bs2b_svn_store\n\n# time sh -c 'rsvndump svn://svn.code.sf.net/p/bs2b/code/ | svnadmin load bs2b_svn_store/'\n[..]\nreal    2m54.403s\nuser    0m1.003s\nsys     0m1.300s\n```\n\nThe output can now be obtained by pointing **svneverver** to the svn store directory `bs2b_svn_store`.\n\n```console\n# svneverever --no-progress bs2b_svn_store/\n```\n\n## Analyzing the output\nThe output of the direct method or the **rsvndump** method will be the same and looks like this:\n\n```console\nAnalyzing 175 revisions...\n\n(  1; 175)  /branches\n( 66;  76)      /libbs2b-config-header\n                    [..]\n(  1; 175)  /tags\n(109; 175)      /description\n                    [..]\n( 46; 175)      /libbs2b\n                    [..]\n( 28;  46)      /libbs2b-2.2.1\n                    [..]\n( 31; 175)      /plugins\n                    [..]\n(  1; 175)  /trunk\n( 80; 175)      /description\n( 80; 175)          /img\n(  2; 175)      /libbs2b\n(  2; 175)          /doc\n(  2;  80)              /img\n(  2;   6)              /src\n(  4; 175)          /m4\n(  2; 175)          /src\n(  2; 175)          /win32\n(  2; 175)              /bs2bconvert\n(  2; 175)              /bs2bstream\n(  2; 175)              /examples\n(  2; 175)              /sndfile\n(  2; 175)      /plugins\n( 38; 175)          /audacious\n( 38; 175)              /m4\n( 38; 175)              /src\n( 24; 175)          /foobar2000\n(143; 175)          /ladspa\n(144; 175)              /m4\n(143; 175)              /src\n( 39; 175)          /qmmp\n(  2; 175)          /vst\n(  2; 175)              /src\n(  2; 175)                  /resources\n(  2; 175)              /win32\n(117; 175)          /winamp\n(  2; 175)          /xmms\n( 12; 175)              /m4\n( 12; 175)              /src\n```\n\nThe ranges on the left indicate at what revision folders appeared first and got deleted latest.\n\nYou can see a few things in this output:\n* That a branch called `libbs2b-config-header` got deleted at revision 76.\n* In which order plug-ins in `plugins` appeared over time.\n* That tag `libbs2b-2.2.1` was deleted at the same revision that a tag folder `libbs2b` appeared.\n\nThe last item we can verify to see if it was _actually_ moved into that tag subfolder.\n\n```console\n# svneverever --no-progress --tags --flatten bs2b_svn_store/ | grep '2.2.1$'\nAnalyzing 175 revisions...\n\n(110; 175)  /tags/description/2.2.1\n( 47; 175)  /tags/libbs2b/2.2.1\n( 28;  46)  /tags/libbs2b-2.2.1\n```\n\nNext I have a look at who the committers where, when they joined or left and how many commits the did (though that last number is of limited value). This can help to write an identity map for svn2git.\n\n```console\n# svneverever --no-progress --committers bs2b_svn_store/\nAnalyzing 175 revisions...\n\n 81 (  1; 174)  boris_mikhaylov\n 94 (  4; 175)  hartwork\n```\n\n# `--help` output\n```console\n# svneverever --help\nusage: svneverever [-h] [--version] [--committers] [--no-numbers]\n                   [--no-progress] [--non-interactive] [--tags] [--branches]\n                   [--no-dots] [--depth DEPTH] [--flatten]\n                   [--unknown-committer NAME]\n                   REPOSITORY\n\nCollects path entries across SVN history\n\npositional arguments:\n  REPOSITORY            Path or URI to SVN repository\n\noptional arguments:\n  -h, --help            show this help message and exit\n  --version             show program's version number and exit\n\nmode selection arguments:\n  --committers          Collect committer names instead of path information\n                        (default: disabled)\n\ncommon arguments:\n  --no-numbers          Hide numbers, e.g. revision ranges (default: disabled)\n  --no-progress         Hide progress bar (default: disabled)\n  --non-interactive     Will not ask for input (e.g. login credentials) if\n                        required (default: ask if required)\n\npath tree mode arguments:\n  --tags                Show content of tag folders (default: disabled)\n  --branches            Show content of branch folders (default: disabled)\n  --no-dots             Hide \"[..]\" omission marker (default: disabled)\n  --depth DEPTH         Maximum depth to print (starting at 1)\n  --flatten             Flatten tree (default: disabled)\n\ncommitter mode arguments:\n  --unknown-committer NAME\n                        Committer name to use for commits without a proper\n                        svn:author property (default: \"<unknown>\")\n\nPlease report bugs at https://github.com/hartwork/svneverever.  Thank you!\n```\n",
    "bugtrack_url": null,
    "license": "GPL v3 or later",
    "summary": "Tool collecting path entries across SVN history",
    "version": "1.7.2",
    "project_urls": {
        "Homepage": "https://github.com/hartwork/svneverever"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "77d56bf03f0858903a979b199c1a1fd51b8d8b74657e4b147496bb0f184eee27",
                "md5": "ebb7749695c7f653b81f8405a46a8d0c",
                "sha256": "2c88d6202b72a1121d567a569cde4c355a31ade5ac4993f4ef61f825dcd90100"
            },
            "downloads": -1,
            "filename": "svneverever-1.7.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ebb7749695c7f653b81f8405a46a8d0c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 9145,
            "upload_time": "2023-06-19T10:39:39",
            "upload_time_iso_8601": "2023-06-19T10:39:39.334797Z",
            "url": "https://files.pythonhosted.org/packages/77/d5/6bf03f0858903a979b199c1a1fd51b8d8b74657e4b147496bb0f184eee27/svneverever-1.7.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ad87a6d0a321aa383081d22916431e63880f4dc1f260c65f9019ce3f701e2a70",
                "md5": "08cafcd00bc35b47fb07ad1fa7c91172",
                "sha256": "bf8accfdcf1bc321dc1d6c51a34660072c1565fc3fd700173aa9c64f6b48d294"
            },
            "downloads": -1,
            "filename": "svneverever-1.7.2.tar.gz",
            "has_sig": false,
            "md5_digest": "08cafcd00bc35b47fb07ad1fa7c91172",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 12924,
            "upload_time": "2023-06-19T10:39:40",
            "upload_time_iso_8601": "2023-06-19T10:39:40.867007Z",
            "url": "https://files.pythonhosted.org/packages/ad/87/a6d0a321aa383081d22916431e63880f4dc1f260c65f9019ce3f701e2a70/svneverever-1.7.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-06-19 10:39:40",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "hartwork",
    "github_project": "svneverever",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "svneverever"
}
        
Elapsed time: 0.07736s