That's because we support small variations in string version (like a/alpha).
So, check if the loop tries to set the same dict key twice and raises an exception in this case.
There's no need for extra traceback, use `raise from`.
Before:
```
Traceback (most recent call last):
File "/home/zas/src/picard/./picard/config.py", line 318, in run_upgrade_hooks
hook(self)
File "/home/zas/src/picard/./picard/config_upgrade.py", line 174, in upgrade_to_v1_3_0dev4
raise Exception("test")
Exception: test
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/zas/src/picard/tagger.py", line 17, in <module>
main(os.path.join(basedir, 'locale'), True)
File "/home/zas/src/picard/./picard/tagger.py", line 1567, in main
tagger = Tagger(picard_args, localedir, autoupdate, pipe_handler=pipe_handler)
File "/home/zas/src/picard/./picard/tagger.py", line 337, in __init__
upgrade_config(config)
File "/home/zas/src/picard/./picard/config_upgrade.py", line 574, in upgrade_config
config.run_upgrade_hooks(log.debug)
File "/home/zas/src/picard/./picard/config.py", line 321, in run_upgrade_hooks
raise ConfigUpgradeError(
picard.config.ConfigUpgradeError: Error during config upgrade from version 1.3.0.dev3 to 1.3.0.dev4 using upgrade_to_v1_3_0dev4():
Traceback (most recent call last):
File "/home/zas/src/picard/./picard/config.py", line 318, in run_upgrade_hooks
hook(self)
File "/home/zas/src/picard/./picard/config_upgrade.py", line 174, in upgrade_to_v1_3_0dev4
raise Exception("test")
Exception: test
```
After:
```
Traceback (most recent call last):
File "/home/zas/src/picard/./picard/config.py", line 318, in run_upgrade_hooks
hook(self)
File "/home/zas/src/picard/./picard/config_upgrade.py", line 174, in upgrade_to_v1_3_0dev4
raise Exception("test")
Exception: test
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/zas/src/picard/tagger.py", line 17, in <module>
main(os.path.join(basedir, 'locale'), True)
File "/home/zas/src/picard/./picard/tagger.py", line 1567, in main
tagger = Tagger(picard_args, localedir, autoupdate, pipe_handler=pipe_handler)
File "/home/zas/src/picard/./picard/tagger.py", line 337, in __init__
upgrade_config(config)
File "/home/zas/src/picard/./picard/config_upgrade.py", line 574, in upgrade_config
config.run_upgrade_hooks(log.debug)
File "/home/zas/src/picard/./picard/config.py", line 320, in run_upgrade_hooks
raise ConfigUpgradeError(
picard.config.ConfigUpgradeError: Error during config upgrade from version 1.3.0.dev3 to 1.3.0.dev4 using upgrade_to_v1_3_0dev4()
```
- get rid of hook args, all are using `config`
- simplify `config._upgrade_hooks` making it a simple dict
- automatically register hooks based on their name, using suffix as version