WheezyにRCSを導入する

■debian WheezyにRCSを導入する。

$ sudo apt-get install -y rcs
$ dpkg -L rcs | grep bin/
/usr/bin/merge
/usr/bin/rcs
/usr/bin/co
/usr/bin/ident
/usr/bin/rcsmerge
/usr/bin/ci
/usr/bin/rcsdiff
/usr/bin/rlog
/usr/bin/rcsclean

■hostsを「~/dummy/etc」にコピーしてそこで作業する。

$ sudo mkdir -p ~/dummy/etc
$ sudo cp -pi /etc/hosts ~/dummy/etc
$ test -d ~/dummy/etc && cd ~/dummy/etc
$ pwd
/home/labunix/dummy/etc
$ ls -l hosts
-rw-r--r-- 1 root root 206  59 22:32 hosts

$ sudo sed -i s/"`hostname -s`\$"/"dummy"/g hosts
$ sudo sed -i s/"`hostname -f`"/"dummy.example.jp"/g hosts

$ cat hosts
127.0.0.1       localhost
127.0.1.1       dummy.example.jp        dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

■RCSの初期化

$ test -d RCS || mkdir RCS
$ rcs -i hosts
rcs: hosts,v: Permission denied

$ sudo rcs -i hosts
RCS file: hosts,v
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> Hello RCS
>>
>> .
done

■ロックとアンロック
 「strict」は厳格モード。

 厳格モードとは、RCS ファイルの所有者であっても、
 ロックしているファイルをチェックインすることができなるモードのこと。

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

■チェックインとチェックアウト
 ※チェックインはロックされている状態で行う。

$ sudo ci hosts;ls -l hosts
hosts,v  <--  hosts
initial revision: 1.1
done
ls: hosts にアクセスできません: そのようなファイルやディレクトリはありません

$ sudo co hosts;ls -l hosts
hosts,v  -->  hosts
revision 1.1
done
-r--r--r-- 1 root root 202  64 21:15 hosts

■ログの確認

$ sudo rlog ./hosts

RCS file: ./hosts,v
Working file: ./hosts
head: 1.1
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 1.1
date: 2013/06/04 13:02:54;  author: root;  state: Exp;
Initial revision
=============================================================================

■使用可能な「ident」の確認

$ man ident 2>/dev/null | grep "^       \$[A-Z][a-z].*\$"
       $Author$
       $Date$ そのリビジョンをチェックインした日付と時刻です。
       $Header$
       $Id$   RCS ファイルの名前がフルパスでないことを除いて、 $Header$,  と同
       $Locker$
       $Log$  チェックインのときに書かれたログメッセージです。 ident  の目的と
       $Name$ リビジョンをチェックアウトするときに使うシンボル名です(ないかも
       $Revision$
       $Source$
       $State$

■編集時にはアンロックされていること。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo sed -i s/"^127.0.0.1"/'# $Id$'"\n"'# $Author$'"\n"'# $Log$'"\
"'# $Date$ '"\n"'# $Header$'"\n"'# $Locker$'"\n"'# $RCSfile$'"\n"'# $Revision$'"\n"'# $Source$'"\n"'# $State$'"\n&"/ hosts

$ cat hosts
# $Id$
# $Author$
# $Log$
# $Date$
# $Header$
# $Locker$
# $RCSfile$
# $Revision$
# $Source$
# $State$
127.0.0.1       localhost
127.0.1.1       dummy.example.jp        dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
■チェックインして更新、チェックアウトしてファイルに書き出す必要がある。
 書き出した後は保護する為、ロックする。

$ rlog hosts | grep lock
locks:
$ sudo ci hosts
hosts,v  <--  hosts
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single '.' or end of file:
>> Add ident options.
>>
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.2
done

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict

■以下のように書き変わる。
 下に見るとおり、「$Id$」か「$Log$」があれば充分。

$ cat hosts
# $Id: hosts,v 1.2 2013/06/04 13:04:48 root Exp $
# $Author: root $
# $Log: hosts,v $
# Revision 1.2  2013/06/04 13:04:48  root
# Add ident options.
## $Date: 2013/06/04 13:04:48 $
# $Header: /home/labunix/dummy/etc/hosts,v 1.2 2013/06/04 13:04:48 root Exp $
# $Locker:  $
# $RCSfile: hosts,v $
# $Revision: 1.2 $
# $Source: /home/labunix/dummy/etc/hosts,v $
# $State: Exp $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

■差分を確認。

$ sudo rcsdiff -r1.1 -r1.2 hosts
===================================================================
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.2
diff -r1.1 -r1.2
0a1,12
> # $Id: hosts,v 1.2 2013/06/04 13:04:48 root Exp $
> # $Author: root $
> # $Log: hosts,v $
> # Revision 1.2  2013/06/04 13:04:48  root
> # Add ident options.
> ## $Date: 2013/06/04 13:04:48 $
> # $Header: /home/labunix/dummy/etc/hosts,v 1.2 2013/06/04 13:04:48 root Exp $
> # $Locker:  $
> # $RCSfile: hosts,v $
> # $Revision: 1.2 $
> # $Source: /home/labunix/dummy/etc/hosts,v $
> # $State: Exp $

■diffらしく表示するならば。。。
 「-u」はアンロックではなく、diffのオプション。

$ sudo rcsdiff -r1.1 -r1.2 -u hosts
===================================================================
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- hosts       2013/06/04 13:02:54     1.1
+++ hosts       2013/06/04 13:04:48     1.2
@@ -1,3 +1,15 @@
+# $Id: hosts,v 1.2 2013/06/04 13:04:48 root Exp $
+# $Author: root $
+# $Log: hosts,v $
+# Revision 1.2  2013/06/04 13:04:48  root
+# Add ident options.
+## $Date: 2013/06/04 13:04:48 $
+# $Header: /home/labunix/dummy/etc/hosts,v 1.2 2013/06/04 13:04:48 root Exp $
+# $Locker:  $
+# $RCSfile: hosts,v $
+# $Revision: 1.2 $
+# $Source: /home/labunix/dummy/etc/hosts,v $
+# $State: Exp $
 127.0.0.1      localhost
 127.0.1.1      dummy.example.jp    dummy

■ということでここでは「$Log$」を採用する。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo vim hosts
$ cat hosts
# $Log$
127.0.0.1       localhost
127.0.1.1       dummy.example.jp        dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo ci hosts
hosts,v  <--  hosts
new revision: 1.3; previous revision: 1.2
enter log message, terminated with single '.' or end of file:
>> Change Ident Log Only.
>>
>> .
done

$ ls
hosts,v

$ sudo co hosts
hosts,v  -->  hosts
revision 1.3
writable hosts exists; remove it? [ny](n): y
done

$ ls
hosts  hosts,v

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict


■1.1と1.3の差分を表示

$ sudo rcsdiff -r1.1 -r1.3 hosts
===================================================================
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.3
diff -r1.1 -r1.3
0a1,4
> # $Log: hosts,v $
> # Revision 1.3  2013/06/04 13:08:03  root
> # Change Ident Log Only.
> #

■1.2は不要になった。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo rcs -o1.2 hosts
RCS file: hosts,v
deleting revision 1.2
done

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict

■1.2の変更情報が消えた。

$ sudo rlog hosts

RCS file: hosts,v
Working file: hosts
head: 1.3
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 2;     selected revisions: 2
description:
Hello RCS
----------------------------
revision 1.3
date: 2013/06/04 13:08:03;  author: root;  state: Exp;  lines: +1 -0
Change Ident Log Only.
----------------------------
revision 1.1
date: 2013/06/04 13:02:54;  author: root;  state: Exp;
Initial revision
=============================================================================

■誰がロックしているか見るには「grep lock」で良い。
 また、ロック中は所有者も変更不可なので、変更は失敗する。
 
$ sudo rlog hosts | grep lock
locks: strict

$ sudo rcs -o1.3 hosts
RCS file: hosts,v
rcs: hosts,v: can’t remove locked revision 1.3

■やっぱり、一行で済む「$Id$」にしよう。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo vim hosts
$ cat hosts
# $Id$
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo ci hosts
hosts,v  <--  hosts
new revision: 1.4; previous revision: 1.3
enter log message, terminated with single '.' or end of file:
>> Change indent Log to Id.
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.4
done

$ cat hosts
# $Id: hosts,v 1.4 2013/06/04 13:12:05 root Exp $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

■マージする。

$ sudo rcsmerge -r1.1 -r1.4 hosts
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.4
Merging differences between 1.1 and 1.4 into hosts

$ rlog hosts

RCS file: hosts,v
Working file: hosts
head: 1.4
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 3;     selected revisions: 3
description:
Hello RCS
----------------------------
revision 1.4
date: 2013/06/04 13:12:05;  author: root;  state: Exp;  lines: +1 -1
Change indent Log to Id.
----------------------------
revision 1.3
date: 2013/06/04 13:08:03;  author: root;  state: Exp;  lines: +1 -0
Change Ident Log Only.
----------------------------
revision 1.1
date: 2013/06/04 13:02:54;  author: root;  state: Exp;
Initial revision
=============================================================================

$ sudo rcs -o1.1 hosts
RCS file: hosts,v
deleting revision 1.1
done
$ sudo rcs -o1.3 hosts
RCS file: hosts,v
deleting revision 1.3
done

■間違えた。

$ sudo ci -s1.0 hosts
hosts,v  <--  hosts
new revision: 1.5; previous revision: 1.4
enter log message, terminated with single '.' or end of file:
>> 1.0 release.
>>
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.5
done

$ cat hosts
# $Id: hosts,v 1.5 2013/06/04 13:20:48 root 1.0 $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo co -r1.4 hosts
hosts,v  -->  hosts
revision 1.4
writable hosts exists; remove it? [ny](n): y
done

$ cat hosts
# $Id: hosts,v 1.4 2013/06/04 13:12:05 root Exp $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo rcs -o1.5 hosts
RCS file: hosts,v
deleting revision 1.5
done

■強制的に「1.0」にして、「Rel」する。
 ※複数人でやると大変なことになるのでローカルのみ。

$ sudo sed -i s/"1.4"/"0.0"/g hosts,v
$ rlog hosts

RCS file: hosts,v
Working file: hosts
head: 0.0
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 0.0
date: 2013/06/04 13:12:05;  author: root;  state: Exp;
Change indent Log to Id.
=============================================================================

$ sudo ci -srel -r1.0 hosts
hosts,v  <--  hosts
new revision: 1.0; previous revision: 0.0
enter log message, terminated with single '.' or end of file:
>> 1st release.
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.0
done

$ sudo rcs -o0.0 hosts
RCS file: hosts,v
deleting revision 0.0
done

$ cat hosts
# $Id: hosts,v 1.0 2013/06/04 13:32:29 root rel $
127.0.0.1       localhost
127.0.1.1       lpic303.test.local      lpic303

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo rlog hosts

RCS file: hosts,v
Working file: hosts
head: 1.0
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 1.0
date: 2013/06/04 13:32:29;  author: root;  state: rel;
1st release.
=============================================================================


$ sudo rcs -L ./hosts
RCS file: ./hosts,v
done

$ sudo rlog ./hosts

RCS file: ./hosts,v
Working file: ./hosts
head: 1.0
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 1.0
date: 2013/06/04 13:32:29;  author: root;  state: rel;
1st release.
============================================================================