画像ビューワを作ったので色々な所(Pypi, AUR)にアップロードしようとして躓いた所

画像ビューワを作ったので色々な所(Pypi, AUR)にアップロードしようとして躓いた所
=====================================


[SaltViewer](https://github.com/GuiltyCat/SaltViewer)というのを開発した．
ざっくりと言うと，`mcomix`から`mcomix3`への移行の中で中々使い辛い所が出てきたのだ．
それを解決するために自分の欲しい機能を詰めこんだものを作ることにした．


アプリの概要
---------------

そもそも`mcomix`や`mcomix3`の代替なんて作らなくても色々あったりする．`vimiv`とか．
でもキーバインドが馴染めなくて，カスタマイズが上手くできなかったりした．

`mcomix3`になってから特にDeleteが消えたり，External Commandが上手く設定できなかったりと不便になってしまった．
`mcomix2`で我慢していたが，python2は嫌なので作って乗り換えることにした．

### 特徴

- 数字指定でページジャンプができる
- 先頭と末尾へのジャンプも可能
- 2ページ表示に対応
- 右左，左右への切り替えも対応
- 超シンプルなシングルファイルスクリプト
- アニメーションGIF, SVGに対応
- zip, rar, 7z, pdfに対応(7zはやたらと遅い)
- キーバインドを設定できる
- pipやyayでインストールできる

結構モリモリの割にコード数は非常にコンパクトなはず．

Pypiに上げようとして躓いた所
--------------------

リポジトリ直下にファイルが多いことは悪だと考えているので，
`src`とか`setup.cfg`を置きたくないので，`setup.py`一本でいく．
`MANIFEST.in`も作らない．

また，これはライブラリではなくコマンドとして実行することを想定している


### `setup.py`を書く

descriptionも面倒なので`README.md`から拝借．
setup_requiresはPKGBUILDでの紆余曲折の名残りで書いたが別にいらないと思う．
本当に最低限しか書いていない．

重要なのが最後の`entory_points`で，これによって`salt-viewer`というコマンドを生成してくれる．
これによって,`pip`や`pyinstaller`みたいにコマンドとして実行できるようにしてくれる．


```python
import setuptools

with open("README.md", "r") as f:
    description = f.read()

requirements=[
        "natsort",
        "pillow",
        "send2trash",
        "rarfile",
        "py7zr",
        "cairosvg",
        "pdf2image",
    ]
setuptools.setup(
    name="salt-viewer",
    version="0.1.2",
    description="Simple image viewer",
    long_description=description,
    long_description_content_type='text/markdown',
    url="https://github.com/GuiltyCat/SaltViewer",
    author="GuiltyCat",
    keywords="image, viewer, archive, animation",
    install_requires=requirements,
    setup_requires=requirements,
    py_modules=['salt_viewer'],
    entry_points={"console_scripts": ["salt-viewer=salt_viewer:main"]},
)
```

### アップロードして気付くPypiのstable性

Pypiって同名のパッケージができないようかなり厳密に作られていて，ある意味で融通が聞かない．
なので，アップロードする時は慎重にする必要がある．

具体的には

- `name`
- `version`

こいつを重複してアップロードすることはできない．
一度削除してもだ．
なので，アップロードして失敗に気付くと，自動的にバージョンを上げざるをえなくなる．


AURに上げようとしてPKGBUILDで躓いた所
--------------------

問題はただ一つだ．公式パッケージにないpythonライブラリへの依存をどう解決するかだ．
これはArchWikiを見ても書いていないしすんごい分かり難いので解説する．

まず，pythonのパッケージだが，基本は公式パッケージのものを優先して`depends`に書く．
これは当然誰もが考えるだろう．でも中には存在しないものもあったりする

そして`pip`はよほど特別なものでない限り使わないのが原則だ．


### AURにはある場合

ほぼ間違いなくAURに上がっているので`depends`に`python-pdf2image`とか書いたりするのだが，
`makepkg -s`をすると全ての依存関係が解決されませんでしたとか出て，失敗する．

うんやかんや悩んだが，答えは簡単で公式リポジトリ以外のパッケージは`makepkg`する前に手動でいれるのが原則なのだ．
なので挙動としてはこれでOKで何も問題ないのだ．

逆に言えば，`yay -S`とかの場合は`makepkg`を実行する前に依存関係を公式リポジトリとAURから検索してインストールしてくれているのだ．


```bash
pkgname=salt-viewer
pkgver=0.1.2
pkgrel=1
arch=("any")
url="https://github.com/GuiltyCat/SaltViewer"
license=("GPL")
depends=("python" "unrar" "poppler" "python-send2trash" "python-pillow"  "python-send2trash" "python-cairosvg" "python-natsort" "python-py7zr" "python-pdf2image" "python-rarfile")
makedepends=("python-setuptools")
md5sums=('SKIP')

optdepends=("unarchiver: unrar alternative" "libarchive: unar alternative")

source=("https://github.com/GuiltyCat/SaltViewer/archive/refs/tags/v${pkgver}.tar.gz")
package(){
	cd SaltViewer-"${pkgver}"
	python setup.py install --verbose --root="${pkgdir}/" --optimize=1 
}
```

このまま`makepkg -s`を実行しても`python-pdf2image`と`python-rarfile`は見つからないがこれで正解．
PKGBUILDをアップロードして，`yay -S`をすると，自動でAURから探し出してインストールしてくれる．


GitHubから持ってきたGitのLogに個人用メールアドレスが!
-----------------------

今の今まで気付いていなかったが，`git log`で登録したメールアドレスが表示されるのね．
それはいいんだけれど，これPublicなのよね．

ということで，盛大なやらかしをしてしまっておりました．
一応対策しましたが，修正しきれていない部分があるかも．

で全てのコミットのuser.emailとuser.nameを書き換えるには`filter-branch`を使う

```bash
git filter-branch -f --env-filter 'export GIT_COMMITTER_EMAIL="<email>"; GIT_COMMITTER_EMAIL="<email>"'
```

最後にこれを無理矢理`push`する．

```bash
git push -f origin main --all
```