Fossil

提供:senooken JP Wiki
2025年1月5日 (日) 00:33時点におけるSenooken (トーク | 投稿記録)による版 (Note)

About

About

外部依存を排除しており、CGIでも動作するという点が非常に良い。気になる。Phorgeの検討が不要になる。

Fossil: A Coherent Software Configuration Management System

いくつか癖があるので注意する。

https://chatgpt.com/c/674e38de-a8c0-800b-8991-e0d68a2f0d86

複数のリポジトリーを取り扱うことは可能。ただし、Web UI上からリポジトリーの新規作成はできない。リポジトリーの新規作成はあくまでコマンドラインから行う必要がある。ここは集中的。

git と fossil の比較 git vs fossil-scm | タイトル

完全に個人なら悪くないが、コマンドの操作体系も異なるし、ややリスクがある。Tracのほうが無難。

Fossil Concepts

Fossil: Fossil Concepts

Adding Features To Fossil

Fossil: Adding Features To Fossil

Fossil Settings

Fossil: Fossil Settings

fossil setingsかWeb UIの[Admin]-[Settings]からfossilの設定を変更できる。リポジトリー毎の設定。

Glossary

Fossil: Glossary

コマンドという概念がある。fossilのコマンドの引数に指定するサブコマンド。これがWebバージョンもある。Web版の場合/commandのように、URLの最後に/をつける模様。

Fossil vs Git

Fossil – Next Generation | Hacker News

Questions And Criticisms

Fossil: Questions And Criticisms

Contribution

Issue

Fossilのチケット「Fossil: Ticket Main Menu」はあるが、これは開発者の管理用になっている。

一般ユーザーがバグを見つけた場合、フォーラム (Fossil User Forum: Forum) で質問することになっている。

なお、fossil本体 [https://fossil-scm.org/home] とFossil User Forum [https://fossil-scm.org/forum/] は別サイトなので、/forumの方でユーザー登録が必要なので注意する。

Note

GitからFossiへの移行時の注意点。

デフォルトでシンボリックリンクを維持しない。

Fossil: Help: allow-symlinks

デフォルトでオフになっている。オンにする。後々問題になるので、シンボリックリンクをそもそもやめた方がいいかもしれない。

Install

Binary

Fossil: A Coherent Software Configuration Management System

ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。

VER=2.25
mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin
cd ~/.local/stow/fossil-$VER
curl -O https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz
tar -xf fossil-$VER.*
ln -fns ../stow/fossil-$VER/fossil ../../bin/

Server

How CGI Works In Fossil

Fossil: How CGI Works In Fossil

How To Configure A Fossil Server

Fossil: How To Configure A Fossil Server

Fosilをサーバーとして稼働させる場合、可能な方式がいくつかある。

  • CGI
  • FastCGI: OpenBSDのみ。
  • server: fossil server
  • SCGI: fossil server実行時。

共用サーバーの場合、ほぼCGIのみ。サーバーがOpenBSDならFastCGIもOK。パフォーマンス優先なら単独サーバーかSCGI。基本はCGIでいいと思う。リポジトリーだからそんなに頻繁にアクセス来ないと思う。

https://chatgpt.com/c/674e38de-a8c0-800b-8991-e0d68a2f0d86

fossilのweb uiではリポジトリーの新規作成ができない。新規作成だけはコマンドラインから行う必要がある。これだけがいまいち。

CGI

Fossil: Serving via CGI

CGIで実行するにはいくつか手順がある。

CGIディレクトリーに以下の内容のCGIスクリプトを用意する。

#!/usr/bin/fossil
repository: /home/fossil/repo.fossil

1行目のシバン部分をインストールしたfossilの絶対パスにする。

repositoryの部分は指定方法がいろいろある。単一リポジトリーのホストなら上記でいいが、複数のリポジトリーを取り扱いたければ、リポジトリー群の格納ディレクトリーをdirectory: で指定する。

また、リポジトリーが不在の場合のリダイレクト先を指定するnotfound:もある。

#!/usr/bin/fossil
directory: /home/fossil/repos
notfound: http://url-to-go-to-if-repo-not-found/

CGIスクリプトをcgi-bin/repoとした場合、展開後は [http://mydomain.org/cgi-bin/repo/XYZ] のようなURLで [/home/fossil/repos/XYZ.fossil] にアクセス可能。

したがって、実際の展開時は、アクセスURLの綺麗さを考慮して、CGIのファイル名をfossilにして、以下の.htaccessでfossilをCGI扱いする。

<FilesMatch fossil$>
	SetHandler cgi-script
</FilesMatch>

これで [http://mydomain.org/fossil/repoX] でアクセスする感じになる。これがいい。こういう方式にしておくと、既存のサイトにfossilを配置するだけでfossilのホストも可能になる。

Configure

Fossil: CGI Script Configuration Options

fossilをCGIで動作させる場合、CGIスクリプトに記載可能なオプションがある。

重要 項目 説明
repository: PATH repositoryかdirectoryは必須。fossilのリポジトリーパス。
x directory: PATH repositoryかdirectoryは必須。fossilのリポジトリーが複数ある場合の親ディレクトリー。親ディレクトリー内の全リポジトリーを提供可能。
notfound: URL directory指定時に、PATH_INFOがfossilのリポジトリーと不一致の場合このURLにリダイレクトする。
x repolist ブール値。この項目の指定があり、direcotoryも指定があれば、PATH_INFOが空の場合、リポジトリーリストを表示する。

応答のskinはrepolist-skinが0以外の最初のリポジトリーの設定で決まる。 サブディレクトリーを再帰して、*.fossilを表示するが以下の例外がある。

  • .で始まるファイルは隠しファイル扱いでスキップ。
  • .fossilのベース名と同じディレクトリーがある場合、リストは表示されるがリンクにはならない。例えば、XYZとXYZ.fossilが同じ階層にある場合。大文字・小文字無視。この場合、ベース名の異なるディレクトリーに移動させる。
localauth
skin: NAME NAMEが組み込みスキンの場合、リポジトリー自体のskinを無視してこれを使用する。

ユーザーにskinを選択させたい場合、skinの異なる複数のCGIスクリプトを用意して、同じrepositoryかdirecotoryを指定すれば、任意のCGIにアクセスすることでスキンを選択可能になる。

files
setenv
HOME
cgi-debug
errorlog
timeout
extroot
redirect
jsmode
mainmenu

とりあえず、direcotryとrepolistを指定すると良いと思う。

#!/usr/bin/fossil
directory: /home/fossil/repos
notfound: /fossil
repolist

repolistはskinがない場合、以下のようなシンプルな表示になる。

Fossil Repositories
Filename		Project Name		Last Modified		Login Group
dir/test.fossil				3.0 days		
fossil.fossil		Fossil		3.1 days		
test.fossil				3.0 days		

repolistはディレクトリー単位の表示はできず、dirにアクセスするとnotfoundになる。notfoundで/か/fossilの一覧ページを指定したほうがよさそう。

Usage

Quick

Fossil: Fossil Quick Start Guide

プロジェクトの基本作業。

Starting A New Project

以下のコマンドで空のfossilリポジトリーを作成する。

fossil init repository-filename

repository-filenameには.fossilの拡張子をつける。必須ではないが、Web UIでディレクトリーを使う場合に、静的ファイルとの区別に.fossil拡張子を使っている。特別な理由がない限り、.fossilの拡張子を指定する。

コマンドを実行すると、以下が表示される。

project-id: 802c1bc57dace208af5be1eb3de12bcc0df020c3
server-id:  be6489d9085a20f2cc0e62c36528e48f7fe5ffb3
admin-user: senooken (initial password is "aNiko5zuBE")

プロジェクトの初期ユーザー名とパスワードが表示される。ユーザー名はOSのユーザー名がデフォルト。オプションで変更可能。

プロジェクト作成時のパスワード表示を見逃したり、忘れた場合は、fossil userコマンドで再設定可能 (Fossil: Help: user)。

fossil user list
fossil user password <username> [<password>]

Checking Out A Local Tree

まず、ツリーのルートとなるディレクトリーを作成して、fossil openでDBからローカルコピーをチェックアウトする。

fossil open ../myclone.fossil

このコマンドで最新のファイル群がチェックアウトされる。以下のコマンド群でローカルツリーの状態を把握できる。

fossil info # git status --name-status相当?
fossil status # git status相当?
fossil changes # git status相当?
fossil diff # git diff相当?
fossil timeline # git log相当?
fossil ls # git ls-files相当?
fossil branch # git branch相当?

違うバージョンやブランチに切り替えるには、以下のコマンドを使う。

fossil update
fossil checkout

updateはローカルの変更を対象バージョンにマージする。checkoutはマージせず、ローカルの変更を上書きする。

updateはgit rebaseに近い。checkoutはgit reset --hard/git checkout -f相当。ローカルの変更を破棄したい場合にcheckoutを使う。

Making and Committing Changes

以下のコマンドでファイルの追加・削除ができる。

fossil add file...
fossil rm file...
fossil addremove file...

以下のコマンドで前回コミットからの変更点の概要を表示する。

fossil changes

正確な差分はfossil diffで表示できる。

fossil diff

fossil difは現在のツリーと最後に変更をコミット時の差分を表示する。コミットしていない場合、最新コミットの差分を表示する。

他のユーザーの変更の確認にはfossil timelineを実行し、コミットを見つけて、diffを実行する。実行する。

fossil timeline
2021-03-28
03:18:54 [ad75dfa4a0] *CURRENT* Added details to frobnicate command (user: user-one tags: trunk)
2021-03-27
23:58:05 [ab975c6632] Update README.md. (user: user-two tags: trunk)
fossil diff --from current --to ab975c6632

ローカルの変更のコミットはcommitで行う。

fossil commit

VISUALかEDITOR環境変数で指定されたエディターでコメントの入力を要請される。

リモートリポジトリーからクローンしている場合、デフォルトで自動同期モードになっているので自動的にリモートにも同期する。

Branching And Merging

新しいブランチの開始には、commit --branchを実行する。Fossilではブランチはコミット時に作成する。ただ、必要に応じてコミット前にbranch newでも作成できる。

2個のブランチのマージには、まずマージ先のブランチを更新する。その後、組み込む他のブランチをマージする。例えば、trunkにfeatureXをマージするにはイアkのようにする。

fossil update trunk
fossil merge featureX
# make sure the merge didn't break anything...
fossil commit

マージがうまくいかなかったりしたら、以下のコマンドで復元できる。

fossil undo

redoもある。

Branching, Forking, Merging, and Tagging

Fossil: Branching, Forking, Merging, and Tagging

一つの親コミットに対して、複数のコミットが派生して並列することをフォークと呼んでいる。それとは別でブランチというのがある。Fossilの内部的にはどちらも同じ。違いは、人間に意図があるか。ブランチは名前のついたフォークという扱い。

特定の機能の開発などで、完了するまで本流とは別で進めたい場合に使う。

fossilでブランチの作成には2の方法がある。

1個目はcommit --branch。ほとんどの場合に推奨される。最初のコミット作成時にブランチも作る。

fossil commit --branch my-new-branch-name

2番目はbranch new。

fossil branch new my-new-branch-name trunk
fossil update my-new-branch-name
fossil commit

この方法は手順が多いし、YAGNI原則に反するのでお勧めされない。

trunkという名前のブランチは、fossilのデフォルトブランチ名。

ローカルチェックアウトがブランチの場合、以下のコマンドで単純にtrunkにマージできる。

fossil merge

自動的に検知してくれる。

Get

基本的な使用方法

# clone
fossil clone <repository url>

# sync: cloneの再開など。
fossil sync -R <repository url>

# rebuild: 取得後のDB再構築。
fossil rebuild <repository path>

上記コマンドでファイルを取得する。Fossilは1ファイルで管理するので、cloneだと取得しきれない可能性がある。中断した場合などはsyncで再取得する。再取得後、反映されない場合、rebuildで取得データからDBを再構築する。

Empty

fossilをcloneすると空で、Web UIで [cannot resolve name: trunk] と表示されることがある。これは、リポジトリーのクローンが失敗している。

以下のコマンドでデータ取得を継続する。

fossile sync -R <repositor url>

これでもダメなら、以下のコマンドでDBを再構築する。

fossile rebuild <repository path>

これで解決した。

Import And Export

情報源=Fossil: Import And Export

FossilにはGitのインポート・エクスポート機能がある。Gitに他のVCSのインポート・エクスポート機能があるので、Gitを経由して他のいろんなVCSをfossilとインポート・エクスポート可能。

Git → Fossil

以下のコマンドでインポート・取り込める。

cd git-repo
git fast-export --all | fossil import --git new-repo.fossil

fossil importコマンドの第3匹数で新しいFossilリポジトリーの名前を指定する。

--gitを指定しているが、実際は不要。なぜなら、Fossilが対応している他のリポジトリーはgitだけだから。ただし、将来的に他のリポジトリーにも対応するかもしれないので、互換性のために一応--gitを指定しておく。

Fossil → Git

Fossilリポジトリーのgitへの変換は以下のコマンド。

git init new-repo
cd new-repo
fossil export --git ../repo.fossil | git fast-import

Mirror A Fossil Repository In Git

Fossil v2.9からFossilリポジトリーのgitまたはGitHubへのミラーリングに対応している。Fossilは元々自己ホスト可能だが、この機能でGitHubでのホストも可能になる。

Bidirectional Synchronization

Gitとの同期機能もある。マークファイルを使用して行う。

例として、fossilリポジトリーの最新コミットをgitに取り込む場合を考える。

まず最初にfossilをクローンして取り込む。

fossil clone /path/to/remote/repo.fossil repo.fossil
mkdir repo
cd repo
fossil open ../repo.fossil
mkdir ../repo.git
cd ../repo.git
git init .
fossil export --git --export-marks ../repo/fossil.marks  \
       ../repo.fossil | git fast-import                  \
       --export-marks=../repo/git.marks

fossilの最新コードをgitに取り込む場合、以下のようにfossil pullで最新コミットを取得後、

cd ../repo
fossil pull
cd ../repo.git
fossil export --git --import-marks ../repo/fossil.marks  \
       --export-marks ../repo/fossil.marks               \
       ../repo.fossil | git fast-import                  \
       --import-marks=../repo/git.marks                  \
       --export-marks=../repo/git.marks
git fast-export --import-marks=../repo/git.marks                  \
    --export-marks=../repo/git.marks --all | fossil import --git  \
    --incremental --import-marks ../repo/fossil.marks             \
    --export-marks ../repo/fossil.marks ../repo.fossil
cd ../repo
fossil push

わかりにくいからあまりしたくない。

インポートの再開

https://chatgpt.com/c/676fb751-f140-800b-b27b-22d683926e3e

インポートが途中で中断された場合。ややこしい。fossil importは1回のコマンドで完了する設計になっているから。途中から再開する機能は直接はない。工夫が必要。

  1. gitリポジトリー側のコミットログをフィルターして必要な部分だけ残す。
  2. fossilに一部インポート済みの場合、インポート後の履歴をformat-patchでファイルに出力して、それをfossil patch applyで取り込む。
  3. 何回かに分けて、fossilのリポジトリーにインポート後、fossilのマージ機能で1個のfossilリポジトリーにマージ。

はっきりいって面倒だから、ローカルPCで履歴を全部取得して、fossilに取り込んで、取り込んだDBを転送した方が確実。

Git to Fossil Translation Guide

Fossil: Git to Fossil Translation Guide

Repositories and Checkouts Are Distinct

Fossilではリポジトリーとチェックアウトは明確に区別されている。gitの場合、.gitのあるディレクトリーで管理しているので、複数のチェックアウトを展開できない。

Other

過去の履歴の削除

https://chatgpt.com/c/6773b1e5-c1a0-800b-b7c4-92c081731919

Fossilでは過去の履歴の削除は推奨されていない。

SQLiteのSQLで直接操作するか、gitに変換してgitで過去の履歴を削除してインポートし直す。

gitでやるほうが安全。ただし、変換時にfossil固有情報が消失する。

Git

gitの場合。

fossil export --git > export.git
fossil init newrepo.fossil
fossil import --git export.git

ただし、この方法はfossil固有の情報が消失する。例えば、以下。

  • Fossilのユーザ名・権限
  • Fossil特有のデータ (Wikiページ、uv)

対策がある。

  • ユーザー名一覧を出力しておく。
  • Wikiページは使わないようにして、埋め込み文書で管理する。
  • uvファイル群も出力しておく。
SQLite

手順:

1 リポジトリをSQLiteで開く

sqlite3 repo.fossil

2 対象コミットを特定: 問題のコミットIDをFossilのログなどで確認します。

fossil timeline

3 対象データを削除: 以下のSQLを実行して問題のデータを削除します(例としてファイルの削除)。

DELETE FROM blob WHERE rid = (対象のリビジョンID);
DELETE FROM delta WHERE srcid = (対象のリビジョンID);
DELETE FROM event WHERE objid = (対象のリビジョンID);

4 データベースを圧縮

VACUUM;

5 整合性を確認

fossil test-integrity
Deleting Content From Fossil

Fossil: Deleting Content From Fossil

Shunningという削除の仕組みがある模様。

Help

[Fossil: Help] にFossilのコマンド、Web UIページ、設定が一覧されている。

数が多いので特に重要なものを整理する。

Available commands:

Repository

  • init/new
  • clone
  • open
  • close
init/new
fossil new ?OPTIONS? FILENAME
fossil init ?OPTIONS? FILENAME
  • --template <repository>: リポジトリーから設定をコピーする。
  • -A|--admin-user USERNAME: 管理ユーザー名を指定する。
  • --project-name: プロジェクト名。/setup_configでの設定?
  • --project-desc: /setup_configの設定?

FILENAMEのファイル名でリポジトリーを作成する。cloneとは区別される。cloneは既存プロジェクトのコピーを作る。new/initは新規プロジェクトを作る。

デフォルトで、現在のログイン名を管理ユーザーに使う。-A|--admin-userで変更可能。

デフォルトで、全設定がデフォルト値で初期化される。既存リポジトリーを--templateで指定すれば、その値で上書き可能。

clone

Fossil: Help: clone

fossil clone ?OPTIONS? URI ?FILENAME?
  • -A|--admin-user <username>
  • -u|--unversioned: uvも同期する。
  • --workdir <dir>: デフォルトで<file name>相当。

URIで指定したリポジトリーのクローンを<file name>という名前のローカルファイルに作成する。<file name> が省略された場合、URIのパスの最後の要素から推測される。

URIは以下のいずれかの形式。

  • HTTP/HTTPS protocol: http[s]://[userid[:password]@]host[:port][/path]
  • SSH protocol: ssh://[userid@]host[:port]/path/to/repo.fossil[?fossil=path/fossil.exe]
  • Filesystem: [file://]path/to/repo.fossil

For ssh and filesystem, path must have an extra leading '/' to use an absolute path.

このコマンドは--no-openを指定しない限り、同時にopen (チェックアウト=ファイル展開) もする。

デフォルトで、現在のログイン名をcloneの管理ユーザーとして使う。-A|--admin-userで上書き可能。

なお、fossilには--depth相当のシャロークローンはない。

Fossil User Forum: Towards shallow cloning」にその説明がある。

Fossilはwikiなどのいろんな情報を持っており、シャロークローンした場合、そこの整合性の維持が難しくなるとのこと。まあ、それはそうだろう。

特定バージョンのファイルが欲しいだけなら、そのバイナリーをWebから取得すればいい。開発者ならcloneすればいい。

open
fossil open <repository> [<version>] [<options>]
  • --repodir <dir>: <repository> がURIの場合、cloneの保存先<dir>。初期値は.。機能していないように見える。--workdirを使えばよさそう。
  • --workdir <dir>: .の代わりに使う格納ディレクトリー。なければ作られる。

よく使う。repo.fossilのfossilリポジトリーに接続して、チェックインをローカルファイルに展開する。

<repository>にはURIも指定できる。最新ファイルだけや、特定バージョンだけ取得する場合にも使えそう。

cloneだと履歴全てを取得する。URIにはcloneと同じ形式が使える。

openすると、openしたディレクトリーに_FOSSIL_ (UNIX系OSだと.fslckout) ファイルが作成される。このファイルで、.fossil SQLiteファイルとディレクトリーを関連づけている。

close

Fossil: Help: close

openの反対。DBへの接続を終了する。未コミットの編集中のファイルがある場合、-fで強制終了が必要。closeすることで誤ってコミットすることがなくなる。

DB接続を終了するといっても、やることは実際にはopen中のディレクトリーないの_FOSSIL_(.fslckout) を削除するだけ。

closeは基本的に実行することはない。closeが必要な場面は限られている (https://chatgpt.com/c/6778f88d-c338-800b-a758-7c51de5856fa)。

  1. リポジトリーのコピーをファイル・テンプレートとして扱いたい場合: 例えば、ディレクトリー構造だけWebからコピーしてきたい場合などに便利。
  2. リポジトリーのコピーを別の用途に使いたい場合。
  3. 複数のバージョンをローカルに展開して、並行作業する場合。

openしているディレクトリーは、.fossilのリポジトリーの履歴保存対象となり、これは1個のディレクトリーとだけ関連づいている。これの切替用コマンド。

Information

  • version
  • info
  • status
  • changes
  • diff
  • timeline
  • ls
  • branch
  • update
  • checkout
  • merge
  • undo
  • redo

Change

  • add
  • rm
  • addremove
  • commit
commit/ci
fossil commit ?OPTIONS? ?FILE...?
fossil ci ?OPTIONS? ?FILE...?

新しいバージョン (コミット) を作成する。-mでコメントテキストか、-Mでコメントファイルの指定がない限り、チェックインコメント用にエディターを開く。

Sharing

  • push
  • pull
  • sync
  • update
  • remote
  • remote-url
push

Fossil: Help: push

fossil push ?URL? ?options?
  • -B|--httpauth <username>:<password>: HTTP認証の情報を指定する。

URLが未指定の場合、最後に使ったclone/push/pull/remote/syncのURLを流用する。

https://chatgpt.com/c/6773b1e5-c1a0-800b-b7c4-92c081731919

リモートサーバーにpushしたい場合、工夫が必要。

  1. pushのURLを指定してユーザー名・パスワードを指定 (例: fossil push https://username:password@server/repo) 。この方法はコマンド履歴に認証情報が残るため控えた方がいい。パスワードを省略してユーザー名だけ指定すれば、対話でパスワードを聞いてくるのでこれがいい。
  2. fossil remote-urlで認証情報付きのURLを設定。これも対話的になるのでいまいちだが、ユーザー名だけを指定すればOK。
  3. sshを設定してサーバーに登録して、URLをsshにする。安全だが手間。

初回だけURLでプッシュして対話的に入力するのがいい気がするかな。

remote
fossil remote ?SUBCOMMAND ...?
  • fossil remote scrub: 記憶したリモートURLのパスワードを忘れる。
  • fossil remote URL: defaultのリモートURLを変更する。

リモートURLの管理用コマンド。git remoteに近い。fossil remote scrubでパスワードの消去と、fossil remote URLでURLにアカウント情報を入力する用途用 [https://username:password@domain/path] 形式。

パスワードを入力しても、以降のfossil remoteのURL表示などでは省略される。

sync

Fossil: Help: sync

fossil sync ?REMOTE? ?options?

ローカルとリモートの変更を同期する。pull/pushを同時で行うイメージ。

Server

  • ui
  • uv
  • server
  • setting
  • configuration
unversioned uv

Fossil: Help: uv

fossil unversioned SUBCOMMAND ARGS...
fossil uv SUBCOMMAND ARGS..

バージョン管理していないファイル (UVファイル) は、同期され、ダウンロード可能だが、履歴を保存しない成果物。Webページやビルド結果の配布などで役立つ。UVへの変更は永続的で、履歴保存していないので、復元不能。コマンド実行時は注意する。

  • add <file>: 該当ファイルを追加または更新する。
  • add <file> --as <uvfile>: 該当ファイルを追加または更新する。ローカルのファイル名とuvとして管理するファイル名を別にできる。
  • edit <file>: 該当ファイルをテキストエディターで開いて修正する。
  • sync [<url>]

fossilのcommitなどは自動的に同期するが、uvは履歴保存していないので、sync実行時までは同期されない。

editはあるが、addでも更新できるので、基本はfossil uv addで更新して最後にsyncするだけだと思われる。addするとローカルの/uvに反映される。

configuration

Fossil: Help: configuration

Web UIで行う設定の同期系コマンド。setup_configなどWeb UIで設定する設定は、fossil syncなどでは同期されず、fossil configurationで同期する模様。

Available web UI pages:

FossilのWeb UIページ。リポジトリーに対して/<page>の形式でアクセスする。ページ毎に?のクエリーパラメーターを受け付けるものがある。

artifact file whatis

パラメーター。

  • ln
    • ln: 行番号を表示。
    • ln=<n>: 行番号<n>をハイライト表示。
    • ln=<m>-<n>: m-n行をハイライト表示。
    • ln=<m>-<n>+<y>-<z>: m-n行とy-z行を強調表示。
  • name=<name> filename=<name> fn=<name>: どれも同じ意味でファイル名かハッシュ。
  • ci=<version>: 表示対象のバージョン。nameと組合せてファイルを特定。
  • txt: 未成形ソーステキスト表示。

fileが特に重要。[Code]タブからファイルをクリックした際に使用する。ファイルの中身を表示する。

?txtを指定することでfossilのレンダーリングなしでtxtで表示する。wikiなどの元データの確認で使う。

download

Fossil: Help: /download

最新ソースのtar玉とZIP提供の簡単なダウンロードページを提供する。

home index not_found

setup_configで指定したホームページにリダイレクトするスタブページ。

uv

Fossil: Help: /uv

バージョン管理していないファイルを表示する。

sqlar tarball zip

指定したチェックインの該当アーカイブファイルを応答する。

setup

Web UIの設定類。ローカルのfossilリポジトリーはclone/pullなどではデフォルトでは取得しない模様。

fossil configuration pullなどで取得・同期する。

setup_config

Fossil: Help: /setup_config

Admin/Configurationページ。プロジェクト名などを設定できる。Homeの初回アクセス時に表示される。

AREA=skinなど相当。

表示内容は [Fossil: setup.c at trunk] が元になっている。

Fossil.gnusocial.jp fossil gnusocial setup config.png

Items

以下の項目がある。

項目 RSS Property default AREA 説明
Project Name project-name プロジェクト名。
Project Description project-description プロジェクト説明。ページヘッダーや検索エンジンなどに使われる。
Canonical Server URL email-url サーバーのURL。他のリポジトリーがcloneなどに使うURL。末尾の/は省略する。永続サーバーとして使わない場合は空白のままにする。https://fossil.gnusocial.jp/fossil/gnusocialのようなプロジェクトホームのベース名が推奨値。
Tarball and Zip-archive Prefix short-project-name Project Name tar玉かZIPアーカイブ生成時の名前の接頭辞。/\のような特殊文字は避けたほうがいい。
Download Tag download-tag trunk /downloadページはプロジェクトのZIPかtarファイルの提供場所として設計されている。デフォルトで、trunkチェックインを提供する。ブランチを変更したければ変更する。
Index Page index-page /home Homeメニュー選択時の表示パス名。リダイレクトループなどの回避のために/始まりであること。
Main Menu mainmenu skin Web UIのメインメニューの項目。TCLリスト (スペース区切りCSV?) で定義。以下の4列で1個のメニューを定義する。
  1. メニュー表示用テキスト。
  2. クリック時のハイパーリンク。/開始はリポジトリールート。
  3. TH1 capexprコマンドの引数。trueの場合にエントリー表示。*は常にtrue。{}は常にfalse。
  4. メニュー項目に適用する追加のクラス名リスト。一部のスキンは、desktoponlyとwideonlyを使用して幅が広い場合のみ表示可能にできる。
Custom Sitemap Entries sitemap-extra /sitemapページの追加メニュー。

[Project Name]/[Project Description]/[Tarball and Zip-archive Prefix] あたりを設定しておけば良いと思われる。

[Canonical Server URL] はなくてもcloneなどはできる。メール用?よくわからない。必要なタイミングで設定する。

Main Menu

[Main Menu] の項目はサイト全体で目につく部分で重要に感じるので、詳説する。

初期値は以下になっている。

Home      /home        *              {}
Timeline  /timeline    {o r j}        {}
Files     /dir?ci=tip  oh             desktoponly
Branches  /brlist      o              wideonly
Tags      /taglist     o              wideonly
Forum     /forum       {@2 3 4 5 6}   wideonly
Chat      /chat        C              wideonly
Tickets   /ticket      r              wideonly
Wiki      /wiki        j              wideonly
Admin     /setup       {a s}          desktoponly
Logout    /logout      L              wideonly
Login     /login       !L             wideonly

capexprの詳細 (Fossil: TH1 Scripts)。権限を意味する文字列 (Fossil: User Capability Reference)。

Fossil本体のMain Menu設定は以下になっている。

Home      /doc/trunk/www/index.wiki          *        {}
Timeline  /timeline                          {o r j}  {}
Docs      /doc/trunk/www/permutedindex.html  *        {}
Code      /dir?ci=trunk                      oh       desktoponly
Forum     https://fossil-scm.org/forum/forum *        {}
To-Do     /rptview/to-do                     {v s a}  desktoponly
Download  /uv/download.html                  *        desktoponly
Setup     /setup                             s        desktoponly

Download /download * {}などでダウンロードページでいいと思う。Fossilデフォルトだとdesktoponlyを指定しているが、そんなに横幅いらないので別に{}でいいと思う。

Web

FossilのWeb UI自体のマニュアルはない模様。画面内の説明で完結している模様。自分で使いながら整理する。

Home

/home にアクセスすると、初回は以下のように表示される。

Fossil unnamed first home.jpg

Home This is a stub home-page for the project. To fill in this page, first go to setup/config and establish a "Project Name". Then create a wiki page with that name. The content of that wiki page will be displayed in place of this message.

また、サイトタイトルが [Unnamed Fossil Project] となっており見栄えが少々悪い。

setup_config (https://fossil.gnusocial.jp/fossil/gnusocial/setup_config) にアクセスして、Project Nameなどを入力する必要がある。

Empty Page

https://chatgpt.com/c/6773b1e5-c1a0-800b-b7c4-92c081731919

Homeページで最低限の設定をすると、設定完了済みとなり、その状態で/homeを表示すると、 [Empty Page] と表示される。

Fossil.gnusocial.jp fossil test home empty-page.png

設定が必要な模様。

解決方法

  1. Webインターフェースでログインし、/Setup ページにアクセスします。
  2. 「Start Page」を設定します:
    • 「Start Page」に表示したいWikiページの名前を指定します(例:Home)。
    • Wikiページがまだない場合は、Wikiを作成してください。

Wikiページの作成方法

  1. /wiki ページにアクセス。
  2. 「新しいWikiページを作成」ボタンをクリック。
  3. ページ名(例:Home)と内容を入力し、保存します。

ただ、このWikiページの作成はちょっと考えたほうがいい。

リポジトリーのファイル内の文書を表示することができるので、そちらでやったほうがいい可能性がある。

Permission

Fossilのユーザー管理機能は権限管理機能と同じ意味。

Password

Fossilのユーザーは、リポジトリーの作成時 (fossil init/fossil import) 時に作成される。

fossil init repository-filename
project-id: 802c1bc57dace208af5be1eb3de12bcc0df020c3
server-id:  be6489d9085a20f2cc0e62c36528e48f7fe5ffb3
admin-user: senooken (initial password is "aNiko5zuBE")

プロジェクトの初期ユーザー名とパスワードが表示される。ユーザー名はOSのユーザー名がデフォルト。オプションで変更可能。

Password reset

プロジェクト作成時のパスワード表示を見逃したり、忘れた場合は、fossil userコマンドで再設定可能 (Fossil: Help: user)。

fossil user list
fossil user password <username> [<password>]

ユーザー名の変更

https://chatgpt.com/c/6773b1e5-c1a0-800b-b7c4-92c081731919

ユーザー名の改名はできない。同じことをしたければ、新ユーザーを作成して、旧ユーザーを無効にする。

1 以下のコマンドで新ユーザーを作成する。

fossil user add <newuser> <mypassword>

2 以下のコマンドで旧ユーザーを無効にする。

fossil user disable <olduser>

3 必要に応じて新ユーザーに旧ユーザーと同じ権限を付与する。

fossil user capabilities 新しいユーザー名 権限

Password skip

https://chatgpt.com/c/6773b1e5-c1a0-800b-b7c4-92c081731919

Fossilではユーザーのパスワードを空にはできない。

パスワードなしでのログインを実現したい場合、いくつかの方法がある。

  1. HTTP Basic認証
  2. SSH鍵認証: ssh鍵でcloneしたらパスワード不要。
  3. Web UIでpublicアクセスを設定: Web UIの/setupに移動し、anonymouseかnobodyユーザーに権限を付与。
  4. 自動ログインCookie

Differences Between Setup and Admin Users

Fossil: Differences Between Setup and Admin Users

Dangerous Capabilities Initially Denied to Everyone

2個の権限だけセットアップユーザーも含めてデフォルトで無効にしている。

Write Unversioned

セットアップユーザーや管理ユーザーでも不能にしている。必ず"y"の権限を付与する。自分で自分に付与してもいい。

Web UIの[Admin]-[Users]-<username>-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]

これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。

Wiki

Wiki in Fossil

Fossilは、様々な用途でFossil wikiやMarkdownを使用する。

  • 単独Wiki: 各wikiページには、チェックインとは独立した独自の変更履歴がある。
  • .wiki/.md/markdownの拡張子の埋め込みドキュメントファイル: ソースツリー内の.wiki/.md/.markdown拡張子のファイルは、Fossilサーバーへの特別なURLでアクセス・表示可能。プロジェクトドキュメントをソースツリーに保存しながらオンラインアクセス可能。
  • バグレポートの説明・コメント/フォーラムメッセージ/チェックインコメント (fossil-wikiのみ)
  • 技術ノート
  • チェックインとブランチのメモ: branch/<branch name> または checkin/<hash> の単独wikiページは、対応するブランチチェックインに関連づけられており、タイムラインと情報画面のaboutセクションに表示される。歴史的なメモの記録に役立つ。

Project Documentation

単独wikiの他に埋め込みドキュメントがある。埋め込み文書はソースツリー内の文書をWebページとして表示する機能。埋め込み文書には以下の利点がある。

  • ソースコードと一緒にバージョン管理されるため、バージョンとドキュメントの対応が明確。
  • 任意のテキストエディターで編集可能。
  • 権限保有者のみ変更可能 (利点にも欠点にもなる)。
1.0 Fossil Support For Embedded Documentation

Web UIでは/docページを使用した埋め込みドキュメントに対応している。埋め込みドキュメントのアクセスは、Webブラウザーで次の形式のURLを指定する。

<base url> /doc/ <version> / <file name>
  • <base url>: fossil webサーバーへのアクセスのメインURL。例えば、https://fossil-scm.org/home (CGIファイルへのパス相当)。
  • <version>: 埋め込み文書を含むチェックイン の名前。ハッシュ、ブランチ、タグ、タイムスタンプなど。特別な識別子の [ckout] にもできる。これはチェックインではなく、ローカルソースツリーのファイルを意味する。/doc/ckout URLはコミット前のプレビューの表示が目的。このプレビューは重要。コミット前に表示結果を必ず確認する。fossil uiには--ckout-alias <name> オプションがあり <name> をckoutの別名にできる。例えば、/doc/trunkをfossil ui --ckout-alias trunkでプレビュー表示できる。
  • <file name>: ソースツリーのルートを基準とした文書パス。MIMEタイプは拡張子で決まる。.css/.gif/html/.jpg/.png/txtなどを認識する (Fossil: Mimetype List)。.wiki/.md/.markdown/.txtには、標準のfossilヘッダーとフッターが追加された状態でレンダリングされる。それら以外は、そのままWebブラウザーに直接配信される。
1.1 HTML Rendering With Fossil Headers And Footers

拡張子が.html/.htmのファイルは、直接Webブラウザーに表示される。ただし、以下のdiv要素で始まる場合、Fossilヘッダーとフッターが追加されてから表示される。

<div class='fossil-doc' data-title='Title Text'>

class='fossil-doc'が必要。data-titleはオプションで、Fossilヘッダーに表示されるタイトルになる。以下が例。

なお、この方法で表示するHTMLは完全に独立しているわけではない。例えば、script要素はFossilのCSP (Content Security Poicy) の影響を受ける。詳細は「Fossil: Skinning the Fossil Web Interface - Header and Footer Processing」と「Fossil: The Default Content Security Policy (CSP)」にある。

2.0 Server-Side Text Substitution
2.1 "$ROOT" In HTML and Markdown Hyperlinks
2.2 "$CURRENT" In "/doc/" Hyperlinks
2.3 TH1 Documents
3.0 Examples

Wiki Formatting Rules

Fossil: Wiki Formatting Rules

Fossil: Markdown Formatting Rules

TH1 Scripts

Fossil: TH1 Scripts

Content

How The Fossil Download Page Works

FossilのDownload (Fossil: Downloads) ページの仕組み。デフォルトではこのページはない。

この画面はバージョン管理していないファイルで実装されている。配布物の格納ディレクトリーのファイルリスト/juuvlistをXMLHttpRequestで取得して、それを表示している。

ただし、ソースコードは/tarballや/zipで元々提供する機能があるので、それで提供している。

以下の手順で行う。

  1. fossil uv editでdownload.jsに新しいリリース用の情報を記入して、新しいバージョン番号を認識できるようにする。
  2. fossil uv addで配布用バイナリーを追加。
  3. fossil uv syncでpush

古い配布物の削除手順。

  1. fossil uv editでdownload.jsの変数の該当項目を削除。
  2. fossil uv rmでuvから削除。
  3. fossil uv syndでpush

y権限を持つユーザーのみuvをpush可能。権限者を最小にして不正なバイナリーの混入を予防できる。

JavaScriptを使って自動生成している。が、JavaScript依存がよろしくない。JavaScriptの生成結果を通常のHTMLでべたがきするのがいい気がする。

Unversioned

Unversioned Content

リリース成果物などの格納用の機能。最新ファイルだけ保存する。

ビルド結果や頻繁に変更されるWebページなどの一時コンテンツの保存に便利。

Accessing Unversioned Files

チェックアウトには含まれておらず、/uv/<file name>でアクセスできる。ファイルの内容はfossil uv cat <file name>かfossil uv export <filename> で取得できる。

ファイル一覧は/uvlistで取得できる。

Syncing Unversioned Files

デフォルトではuvはリポジトリー缶で同期されない。以下のコマンドのいずれかの実行が必要。

fossil sync -u
fossil clone -u URL local-repo-name
fossil unversioned sync

fossil uv syncはuvのみ同期する。それら以外のsync -uとclone -uはuv以外も同期する。

-uはsyncとcloneでのみ機能して、push/pullでは機能しない。uvは履歴がなく、同期を失敗すると破損して、危険なのでy権限がないと同期できない。それまでは追加できるが、同期はできない。

uvの一括保存

https://chatgpt.com/c/6773b1e5-c1a0-800b-b7c4-92c081731919

uvはリポジトリーにあるだけで、チェックインにはない。ファイルとして扱いたい場合、保存する必要がある。

手動でよければ、/uvか/uvlistにアクセスすればいい。

fossil uv listで一覧を取得して、fosssil uv catかexportでファイルに出力する。

一括で行いたければ組み合わせる。

fossil uv ls | while read file; do
  fossil uv export "$file" --to "./$file"
done

Image Format vs Fossil Repo Size

Fossil: Image Format vs Fossil Repo Size

Other

Skin

/skins

Fossilの見た目をskinと呼んでいる。このSkinは/skinsにアクセスすることでユーザーごとに変更可能。内容はCookieで記憶していて、それで変更を維持する。

/fdscookieにアクセスすると、現在のスキンを確認できて、削除もできる。

標準skin

Fossil: Files in skins/ of version-2.25

skinsディレクトリーがskinの格納場所。ここに標準skinもある。

default.css

Fossil: default.css at version-2.25

FossilのUIの共通スタイル。

desktoponly sidebar wideonly

Main Menuなどで登場する画面幅の表示制御のスタイル。「Fossil: default.css at version-2.25」で定義。

/* Objects in the "desktoponly" class are invisible on mobile */
@media screen and (max-width: 600px) {
  .desktoponly {
    display: none;
  }
}
/* Float sidebars to the right of the main content only if there's room. */
@media screen and (min-width: 600px) {
  .sidebar {
    float: right;
    max-width: 33%;
    margin-left: 1em;
  }
}
/* Objects in the "wideonly" class are invisible only on wide-screen desktops */
@media screen and (max-width: 1200px) {
  .wideonly {
    display: none;
  }
}