FreeBSD の CVS サーバが無効に2014年07月01日 12時13分34秒

久しぶりに、cvs stat を /usr/src で行った。しかし、動かない。前回 FreeBSD の CVS を使ったのは四ヶ月ほど前のことだった。

既に CVS サーバはハンドブックから削除されて久しいが、未だに手元に残っていたサーバ四つを試したところ、三つが既にアクセス不可能。そして、一つだけ繋がったサーバにも既に CVS のファイルが無く、diff も取れない。

SVN で CVS と同じバージョンを取り出し、tar 等でファイルを上書きをすれば、CVS を使わないでも移行は出来るが、バージョンの細かな違いの変更などを手違いで消さないように気を付けないといけない。

Subversion でレポジトリを変更2014年05月05日 12時59分21秒

CVS で FreeBSD を追いかけていた時に、CVS サーバが落ちていたりする事があった。そんな時は、CVS/Root ファイルを書き換えて、サーバの位置を変更していたものだった。

SVN も中央管理型なので、レポジトリを移動した時、プロトコルを変更した時、ミラーの交換したい時に、手元のコピーの情報を更新する必要がある。

SVN には svn switch --relocate があり、それを行う。svn relocate もあるみたいだ。


% svn help switch
...
 --relocate               : relocate via URL-rewriting
...
% svn help relocate
relocate: Relocate the working copy to point to a different repository root URL.
usage: 1. relocate FROM-PREFIX TO-PREFIX [PATH...]
       2. relocate TO-URL [PATH]
...

SVN は同じ動作が複数のコマンドから出来る事が多い気がする。

SVN サーバを構築して FreeBSD のソースをミラーした時等に使える。丁度、SVN サーバの URL が公開されているので、例には持ってこいだ。


% svn co https://svn0.us-west.FreeBSD.org/ports/head /usr/ports

でチェックアウトしてあるので

% cd /usr/ports
% svn switch --relocate https://svn0.us-west.FreeBSD.org/ports/head \
    http://svnweb.icmpv6.org/ports/head
%

で変更できる。

CVS FreeBSD から SVN FreeBSD へ移行2014年02月19日 12時18分57秒

PR からパッチを拾ってきてあったり、自分用に若干変えてあったりして、自分でカーネルを作りなおしている人達は、どの位残っているのだろうか。そんな人達にはこんな手順等要らないと思いつつも記す。

CVS でカーネルを取得できるのは、8.4 RELEASEまで。しかし、いきなり移行目的で最新を取り出すのは茨の道にわざわざ突っ込む行動。ローカルパッチを取り出すには cvs diff と patch を使わなければいけないので、異なるバージョンで行うと作業し辛い rej ファイルと格闘しなくてはいけなくなる。

それを避けるのは、単純に cvs と svn で同じバージョンを取り出せばいい。FreeBSD ではわざわざ全ての履歴を CVS から SVN に移してくれている。また、他のリリースに移るのにも svn のマージコンフリクトを用いた方が、作業効率が数段も良い。

手元には、9.1 まで追った cvs があるので、それで一例。9.1-RELEASE は 8.4-RELEASE よりも小さい数字だが、リリースの日付けは前なので、cvs にある。


% mv src src-cvn
% ( cd src-svn; cvs diff ) > 9.1-diff 
% svn checkout https://svn0.us-east.freebsd.org/base/release/9.1.0 src
...
A    src/include/utmpx.h
A    src/include/rpcsvc/ypclnt.h
A    src/include/rpcsvc/key_prot.x
 U   src
Checked out revision 262199.
% cd src
% patch -p0 < ../9.1-diff
...
% svn switch https://svn0.us-east.freebsd.org/base/release/10.0.0

最後に、10-RELEASE に移る場合は svn switch を使う。

FreeBSD の CVS も 8.4 で終わりみたいだ2014年02月10日 11時56分53秒

FreeBSD も長いこと使っているが、時代の移り変わりを感じる時がある。

% cvs stat Makefile
===================================================================
File: Makefile          Status: Up-to-date

   Working revision:    1.404.2.2
   Repository revision: 1.404.2.2       /home/ncvs/src/Makefile,v
   Sticky Tag:          RELENG_8_4 (branch: 1.404.2)
   Sticky Date:         (none)
   Sticky Options:      (none)

   Existing Tags:
        RELENG_8_4                      (branch: 1.404.2)
        RELENG_9_1_0_RELEASE            (revision: 1.392.2.3.2.2)
        RELENG_9_1                      (branch: 1.392.2.3.2)
        RELENG_9_1_BP                   (revision: 1.392.2.3)

8.4 Release 以降は cvs は更新されていない。

Subversion は今でも好きではなく、cvs で更新できる間は cvs でと、移行していなかったがそろそろ年貢の納め時の様だ。

何より痛恨なのは、Subversion はタグが作れない事。そのように設計されたとは言うが、設計そのものが間違っている。リリースビルドをするとき等は、ブランチでコンパイルし、成功した暁にタグを作りたい。逆だと、手順が二倍に増える。そして、タグをリリースビルド後に作って、タグにコードを svn switch すると、全てのファイルのタイムスタンプが更新されデバッガが、好ましく思わない。

ディスク容量が cvs の二倍必要。今は気にはしないが、何年も前に少ない容量で遊んでいる時は、影響が大きかった。これ自体は、特にリモートの場合に、diff や stat でアクセスを回避できるので、利点はしっかりとある。

ただ cvs は RCS の延長なので、コミットの単位がファイル毎等の問題があったのも事実。FreeBSD では利用者の一人に過ぎないので、svn を使うこと自体には不満は無いが、少し下調べが必要だ。

FreeBSD の差分 make のやり方2009年08月27日 00時57分14秒

FreeBSD のソースコードもどんどんと増えている。また、GCC の性能もあがっているが、それに伴いコンパイルにかかる時間も伸びている。何年かに一度ハードウェアを更新すると、一気に早くなる。各々の時期に一般的なハードウェアに対する FreeBSD のコードのコンパイル時間は、3.0 から使い始めた当初からあまり変わっていない様に感じる。それでも一時間から二時間はかかる。

その時間を短縮するために、変わった部分だけをコンパイルすれば大分時間を短縮することが出来る。world の場合は、-DNO_CLEAN を kernel の場合は、-DNO_KERNELCLEAN を付けることにより、変わっていない部分を無視させることが出来る。

しかし、これも時折失敗することがある。その原因は make: don't know how to make /usr/src/xxx. Stop が全てだと思う。make が作成した .depend ファイルに削除されたファイルの記述があり、make がそれを探すのでエラーになる。また、一部でアセンブラコードを生成する場所もあり、そこで削除されたファイルにより同じようなエラーになる。

そのような時は、


% find /usr/obj -name '.depend' -or -name '*.S' | xargs rm

で依存関係のみを削除する。大体、一つこのエラーが出ると、他でも大体起きているので、一気に全て削除した方が手間が少ない。


% cd /usr/src && make cleandepend

でも出来ると聞いたこともあるが、自動生成のアセンブラプログラムで問題が起きそうなので自分では試したことはない。

なお、この方法は CVS でファイルを取得するのなら、過去のソースコードに遡ったときでも使える。CVS が古いリビジョンを取得し、ローカルのファイルの更新時刻を更新するためだ。Subversion ではブランチが違うと同じことは出来ない。また、他の更新時刻を更新しない方法で古いファイルに戻した時も正しく動作しない。

.depend ファイルは全て作り直すが、オブジェクトはそのまま再利用可能なので、新しく buildworld や buildkernel を行なうよりも早い。

FreeBSD のコミットが再開された2009年08月13日 22時19分52秒

FreeBSD のコミットが長らく止まっていたが問題が解消されたそうだ。

新しいコミットも見られるようになった。この影響で、RELEASE-8.0 は一ヵ月程遅れるらしい。

FreeBSD の Subversion が止まっている2009年08月10日 10時09分18秒

FreeBSD のコミットが止まっている。8 系のブランチが作られた頃から、変更が流れてこない。

どうも話によると、Subversion から CVS の変換で問題があったらしく、止まっているらしい。Subversion を使い初めて、初めてのブランチ作成で問題があったらしい。

current を壊した2009年05月28日 21時56分18秒

一ヵ月振りにソースからのシステムの更新を試みた。CURRENT をはじめ、7.1-RELEASE と 7.2-RELEASE のコードがあった。

まずは最新のコードの取得を試みた。CURRENT の更新をまず試す。あまりに久しぶりだったので、間違えて CVS でソースの更新を始めてしまった。気が付いたときは既に遅し。気が付くのにも二時間ぐらい掛かったのも問題ではあるが。どういった経緯だか覚えていないが、CVS の管理ファイルもソース配下にあったため、Subversion のワークエリアで CVS が使えてしまったのだ。

これで、ほとんど修正不可能な位まで壊してしまった。Subversion でまだ取得していないファイルを既に CVS で取得してしまったので、その各々のファイルに対し警告が出る。かなりの数なので手で処理する気が失せる数だ。それに久しぶりの更新だったので、どのソースにどんなパッチが当たっているのかを完全に忘れた。CVS と Subversion が中途半端に混ぜられて使ったので diff もうまくとれない。

大失敗した。CVS と Subversion のワークエリアは「混ぜるな危険」の様だ。

複数の FreeBSD バージョンのソースを追う2009年03月25日 10時16分07秒

素の FreeBSD だと、/usr/src にソースコードが一式入る。しかし、これだと複数のバージョンを追うのに都合が悪い。7.1-RELEASE を主に使いつつ、8-CURRENT で何が起きているのか様子を見る。7.2-PRERELEASE になったので、試用して影響を見定める等といった事をやりたい。

buildworld と buildkernel の make の記述は、生成物を /usr/obj の下に、realpath を使って配置する。そのため、FreeBSD のソースは任意の場所に置くことが出来る。

/usr/src 以下に、各バージョン毎にソースを置くことも出来る。/usr/src に限る必要は無いのだが、元々そこにあった物なので、それに沿う形で選んだ。


% ls /usr/src/
HEAD            RELENG_7_1      head            release7.1.0
RELENG_7        RELENG_7_2      release6.1.0    stable7

HEAD や RELENG 等の大文字のディレクトリは cvs を用いて取得した。head や release 等の小文字のディレクトリは Subversion を用いて取得した。これは、FreeBSD のプロジェクトの付けたブランチ名やタグ名を基に命名した方が判りやすいと思ったからだ。

各リリースのオブジェクトはこの様に配置される。現時点では、RELENG_7_2 は存在しないのだが、すでに 7.2-PRERELEASE となっているので、そう命名した。


% ls /usr/obj/usr/src/
RELENG_7_1      head            release7.1.0
RELENG_7_2      release6.1.0    stable7

クロスコンパイルをすると、また微妙に違った位置に配置されるのも付け加えておく。

次回

rcs short tour2009年02月10日 00時54分39秒


% cd /tmp
% mkdir rcswork
% cd rcswork
% echo "A B C" > a.txt
% echo "1 2 3" > 1.txt
% ci a.txt 
a.txt,v  <--  a.txt
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> /tmp/rcswork/a.txt is under RCS.
>> .
initial revision: 1.1
done
% ci 1.txt
1.txt,v  <--  1.txt
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> /tmp/rcswork/1.txt is under RCS.
>> .
initial revision: 1.1
done
% ls -a
.       ..      1.txt,v a.txt,v
% co 1.txt,v 
1.txt,v  -->  1.txt
revision 1.1
done
% echo "10 11 12" >> 1.txt  
1.txt: Permission denied.
% co -l 1.txt
1.txt,v  -->  1.txt
revision 1.1 (locked)
done
% echo "10 11 12" >> 1.txt
% rcsdiff 1.txt
===================================================================
RCS file: 1.txt,v
retrieving revision 1.1
diff -r1.1 1.txt
1a2
> 10 11 12
% rcsdiff -u 1.txt
===================================================================
RCS file: 1.txt,v
retrieving revision 1.1
diff -u -r1.1 1.txt
--- 1.txt       2009/02/09 16:11:20     1.1
+++ 1.txt       2009/02/09 16:15:12
@@ -1 +1,2 @@
 1 2 3
+10 11 12
% ci -m 'Added 2 digits numbers.' 1.txt
ci: missing message for -m option
% ci -m'Added 2 digits numbers.' 1.txt
1.txt,v  <--  1.txt
new revision: 1.2; previous revision: 1.1
done
% ls -a
.       ..      1.txt,v a.txt,v
% mv a.txt,v A.txt,v
% ls -a
.       ..      1.txt,v A.txt,v
%rlog 1.txt,v 

RCS file: 1.txt,v
Working file: 1.txt
head: 1.2
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 2;     selected revisions: 2
description:
/tmp/rcswork/1.txt is under RCS.
----------------------------
revision 1.2
date: 2009/02/09 16:17:04;  author: uyota;  state: Exp;  lines: +1 -0
Added 2 digits numbers.
----------------------------
revision 1.1
date: 2009/02/09 16:11:20;  author: uyota;  state: Exp;
Initial revision
----------------------------
=============================================================================
% rlog A.txt,v

RCS file: A.txt,v
Working file: A.txt
head: 1.1
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
/tmp/rcswork/a.txt is under RCS.
----------------------------
revision 1.1
date: 2009/02/09 16:10:56;  author: uyota;  state: Exp;
Initial revision
----------------------------
=============================================================================

旅程cvsMercurial/hggitSubversion/svnrcssvk