summaryrefslogtreecommitdiffstats
path: root/Demo/pdist/rrcs.py
blob: abd6ade4deae27c5a3cbd334cf5f21f6e65d4e41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#! /usr/local/bin/python

"Remote RCS -- command line interface"

import sys
import os
import getopt
import string
import md5
import tempfile
from rcsclient import openrcsclient

def main():
	sys.stdout = sys.stderr
	try:
		opts, rest = getopt.getopt(sys.argv[1:], 'h:p:d:qvL')
		if not rest:
			cmd = 'head'
		else:
			cmd, rest = rest[0], rest[1:]
		if not commands.has_key(cmd):
			raise getopt.error, "unknown command"
		coptset, func = commands[cmd]
		copts, files = getopt.getopt(rest, coptset)
	except getopt.error, msg:
		print msg
		print "usage: rrcs [options] command [options] [file] ..."
		print "where command can be:"
		print "      ci|put      # checkin the given files"
		print "      co|get      # checkout"
		print "      info        # print header info"
		print "      head        # print revision of head branch"
		print "      list        # list filename if valid"
		print "      log         # print full log"
		print "      diff        # diff rcs file and work file"
		print "if no files are given, all remote rcs files are assumed"
		sys.exit(2)
	x = openrcsclient(opts)
	if not files:
		files = x.listfiles()
	for fn in files:
		try:
			func(x, copts, fn)
		except (IOError, os.error), msg:
			print "%s: %s" % (fn, msg)

def checkin(x, copts, fn):
	f = open(fn)
	data = f.read()
	f.close()
	new = not x.isfile(fn)
	if not new and same(x, copts, fn, data):
		print "%s: unchanged since last checkin" % fn
		return
	print "Checking in", fn, "..."
	message = asklogmessage(new)
	messages = x.put(fn, data, message)
	if messages:
		print messages

def checkout(x, copts, fn):
	data = x.get(fn)
	f = open(fn, 'w')
	f.write(data)
	f.close()

def info(x, copts, fn):
	dict = x.info(fn)
	keys = dict.keys()
	keys.sort()
	for key in keys:
		print key + ':', dict[key]
	print '='*70

def head(x, copts, fn):
	head = x.head(fn)
	print fn, head

def list(x, copts, fn):
	if x.isfile(fn):
		print fn

def log(x, copts, fn):
	flags = ''
	for o, a in copts:
		flags = flags + ' ' + o + a
	flags = flags[1:]
	messages = x.log(fn, flags)
	print messages

def diff(x, copts, fn):
	if same(x, copts, fn):
		return
	flags = ''
	for o, a in copts:
		flags = flags + ' ' + o + a
	flags = flags[1:]
	data = x.get(fn)
	tfn = tempfile.mktemp()
	try:
		tf = open(tfn, 'w')
		tf.write(data)
		tf.close()
		print 'diff %s -r%s %s' % (flags, x.head(fn), fn)
		sts = os.system('diff %s %s %s' % (flags, tfn, fn))
		if sts:
			print '='*70
	finally:
		remove(tfn)

def same(x, copts, fn, data = None):
	if data is None:
		f = open(fn)
		data = f.read()
		f.close()
	lsum = md5.new(data).digest()
	rsum = x.sum(fn)
	return lsum == rsum

def asklogmessage(new):
	if new:
		print "enter description,",
	else:
		print "enter log message,",
	print "terminate with single '.' or end of file:"
	if new:
		print "NOTE: This is NOT the log message!"
	message = ""
	while 1:
		sys.stderr.write(">> ")
		sys.stderr.flush()
		line = sys.stdin.readline()
		if not line or line == '.\n': break
		message = message + line
	return message

def remove(fn):
	try:
		os.unlink(fn)
	except os.error:
		pass

commands = {
	'ci': ('', checkin),
	'put': ('', checkin),
	'co': ('', checkout),
	'get': ('', checkout),
	'info': ('', info),
	'head': ('', head),
	'list': ('', list),
	'log': ('bhLRtd:l:r:s:w:V:', log),
	'diff': ('c', diff),
	}

if __name__ == '__main__':
	main()