日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

fossil を使ってみる

更新履歴

2020/07/13

  • fossil init --template の使い方追加
  • ブログ内記法を Markdown へ変更
  • 同じ記事の記法変更は不可の為、Markdown 記法の記事を新規に追加し、旧記事は内容削除、新記事へのリンクを入れ、新記事にも旧記事の注記を追加

2017/09/15

  • branch の使い方を追加

記事移行

今回久々に追記したついでに今使ってる Markdown 方式に変更。 しかしはてブロって既存記事の変更はできないのね。微妙に不便。 旧記事 は内容削除して 新記事のリンクだけ残してある。

参考

はてブロヘルプに書いてあるらしい。

いったん作成した記事の編集モードを、後から変更することはできません。

はじめに

最近、個人ツールではあるがちょっと規模が大きめのものを作ろうと色々検討している時、SCM 含むプロジェクト管理ツール使うかどうしようかと頭をもたげてきた。開発業務をまともにやってきた訳ではない為この手のツールを使った事がない。

そんなに比較検討した訳ではないが、使う要件として - 自分ひとりなので導入・運用コストが軽いやつ - 公開するものではない

この辺りで適していそうな fossil なるものを使ってみる事にした。どうやら sqlite の作者が作ったものらしい。

参考リンクとか

以降は自分の作業ログ的なものを書いていく。

インストール

単一実行ファイルなので PATH が通った所に置くだけ。

リポジトリ作成

> fossil init hoge.repo
project-id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
server-id:  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
admin-user: xxxxxx (initial password is "xxxxxx")

ユーザ ID は今ログインしてるユーザ、パスワードは初期のが何か自動生成される。このメッセージはパスワードも書かれているので一応保管しとく。余談だが .repo と拡張子付けないと作れない事に小ハマりしたw

リポジトリ作成時、他既存リポジトリから設定を引き継ぐ

リポジトリ作成後、毎回以降の設定するのも面倒だなと思ってちょっと調べたら 今更だが既存リポジトリから設定を引き継ぐオプションがあったのでメモ。

> fossil init --template other.repo hoge.repo

other.repo に設定を引き継ぎたいリポジトリファイルの指定をする。

リポジトリ設定

UI 画面起動

> fossil ui c:\path\to\hoge.repo

要パス指定。自分の Windows7 環境だとコマンド叩いた後 Firefox で勝手に起動した。またこのコマンドは fossil によるローカル Web サーバが動くので別コマンドプロンプト立ち上げて動かしとくのが良さそう。

プロジェクト名設定

立ち上がると出てくる画面に Project Name 入れてくれと出るのでそれに従い setup/config でプロジェクト名を設定。leiningen で作ったプロジェクト名と同じにした。後は Project Description に軽く概要だけ書いて設定。他にも WikiWYSIWYG にするかどうかとか Wiki マークアップに HTML を使うかどうかの設定とかあるがそれは変えずにそのままとした。

ローカル時間に変更

Timeline 見ると、初っ端のリポジトリ作られました的なものがあるが、その時間が UTC だったので Admin -> Timeline -> Use UTC のチェックをオフに変更。

ファイル追加

無視ファイル指定

コマンドラインだと fossil settings ignore-glob を使うようだが、Web UI にも setting にあったのでそこで設定。

.gitignore, repl-port, *.class,*.dependencies

leiningen でソース管理外にするのはこれくらいかな。残念ながら ディレクトリ指定はできない模様ディレクトリ指定できれば target 以下を除外するとかもう少し簡単にできるんだがしょうがない。

リポジトリチェックアウト

trunk

> fossil open hoge.repo

最新のワーキングコピーをカレントフォルダに作るコマンドだが、全く新規の場合は当然何もない。また、後述のファイル追加後だと FOSSIL とか言うテンポラリファイルらしきものができる。

特定の branch をチェックアウト

> fossil open hoge.repo some-branch

some-branch が branch 名になる。

ファイル追加

hoge という leiningen プロジェクトフォルダ直下に移動した上で fossil add . とする。

> fossil add .
ADDED  hoge/doc/intro.md
ADDED  hoge/LICENSE
ADDED  hoge/project.clj
ADDED  hoge/README.md
ADDED  hoge/src/hoge/core.clj
ADDED  hoge/test/hoge/core_test.clj

無視ファイル・フォルダ設定効いてるみたい。

変更確認

コミット前にどのファイルが変更されるかを確認するためのコマンドはこれ。

fossil changes

コマンド実行結果は add 時と同じなので割愛。

ファイルレベルの追加変更削除ならこちら。個人的には実際はこっちを使う事が多い。

fossil status

変更確定

fossil commit -m "describe changes."

-m オプションで変更点を記述するみたいだが敢えて -m を指定せずにコマンド叩くとメモ帳が開いてコメント入れてくれと出た。 日本語を入れて Web UI で Timeline 確認してみるとちゃんと表示できてる。

ただ改行の Warning がちと気になる。

./doc/intro.md contains CR/NL line endings. Use --no-warnings or the "crnl-glob" setting to disable this warning.
Commit anyhow (a=all/c=convert/y/N)? a
New_Version: 19dd6de9a5e6be5b62509a68023ea34350dbe1d2

改行は自分で管理するので今回はチェックしないように変更。やり方は Setting にある cnrl-glob の設定値に * を入れれば OK。

branch を切る

自分の目的は trunk はリリース用として現状維持しておきたいが、branch を切る事で trunk 影響を与えずに 実験的な変更や大きめの変更を行いたい時に使う。

trunk を open したワーキングディレクトリで、

fossil branch new new-branch-name basis

basis は trunk のどのバージョンで branch を切るか、new-branch-name が作成するブランチの名前になる。 切った branch 以降で作業したい場合は、trunk とは別のワーキングディレクトリを適当に作って そこで fossil open で new-branch-name を指定する。

ワークフロー

  1. チェックアウト fossil open c:\path\to\fossil.repo
    • これもバッチ作って PATH が通った所に置いといて、1 日の開始にまずチェックアウトかける
  2. ゴリゴリコーディング
  3. 変更

    • ファイル追加なら add
    • ファイル削除なら rm
    • 既に管理下にあるファイルの変更ならコミットまで特に何もする必要なく、こまめにファイル保存だけしとく
    • 元に戻したければ revert
  4. そんでキリの良い所でコミット

他調べた事

diff

Web UI だと Timeline -> Show files で diff のリンクが出て前のリビジョンとの差分が確認可能。コマンドラインでも diff とか gdiff があるようだが動作未確認。

emacs 連携

Emacs-Fossil: Emacs Integration for Fossil ここ見るとできなくはなさそうだがめんどくさそうな割に恩恵が少なさそうなので自分は未設定。

UI をスタートアップ設定する

UI 用組込 Web サーバは PC 起動したら動かしっぱなしにしておきたいのでスタートアップ用のバッチファイルを用意する。中身は単に fossil ui c:\path\to\fossil.repo なだけ。Web ブラウザを起動させたくない時は fossil server で良いらしいが一人用だし ui でいいや。

これの繰り返しかな。

複数人でやる場合はログコメントは入れてもらうとかキリの良い所でのコミットを守ってもらうとか追加時はちょいと話し合うとか緩いながらもある程度のルール決めはした方が良さ気。

他気になる部分

SQL 直接叩けるっぽい

スキーマ確認は必要だが、内部 DBMSsqlite 使ってる事もあり SQL 直接叩けるみたい。UI では見せてないような細かい情報もこれで取れるんじゃないかなとちょっと期待。Web UI だと何のチェックもしてないから十分注意してくれとあるが、使うにしても自分は SELECT しかやるつもりはないので多分大丈夫かな。