comparison hgext/convert/cvs.py @ 9543:56a5f80556f5

convert/cvs: stop supporting external cvsps
author Patrick Mezard <pmezard@gmail.com>
date Mon, 05 Oct 2009 22:57:15 +0200
parents bbc78cb1bf15
children 25e572394f5c
comparison
equal deleted inserted replaced
9542:5287de171d74 9543:56a5f80556f5
20 cvs = os.path.join(path, "CVS") 20 cvs = os.path.join(path, "CVS")
21 if not os.path.exists(cvs): 21 if not os.path.exists(cvs):
22 raise NoRepo("%s does not look like a CVS checkout" % path) 22 raise NoRepo("%s does not look like a CVS checkout" % path)
23 23
24 checktool('cvs') 24 checktool('cvs')
25 self.cmd = ui.config('convert', 'cvsps', 'builtin')
26 cvspsexe = self.cmd.split(None, 1)[0]
27 self.builtin = cvspsexe == 'builtin'
28 if not self.builtin:
29 ui.warn(_('warning: support for external cvsps is deprecated and '
30 'will be removed in Mercurial 1.4\n'))
31
32 if not self.builtin:
33 checktool(cvspsexe)
34 25
35 self.changeset = None 26 self.changeset = None
36 self.files = {} 27 self.files = {}
37 self.tags = {} 28 self.tags = {}
38 self.lastbranch = {} 29 self.lastbranch = {}
39 self.parent = {}
40 self.socket = None 30 self.socket = None
41 self.cvsroot = open(os.path.join(cvs, "Root")).read()[:-1] 31 self.cvsroot = open(os.path.join(cvs, "Root")).read()[:-1]
42 self.cvsrepo = open(os.path.join(cvs, "Repository")).read()[:-1] 32 self.cvsrepo = open(os.path.join(cvs, "Repository")).read()[:-1]
43 self.encoding = locale.getpreferredencoding() 33 self.encoding = locale.getpreferredencoding()
44 34
48 if self.changeset is not None: 38 if self.changeset is not None:
49 return 39 return
50 self.changeset = {} 40 self.changeset = {}
51 41
52 maxrev = 0 42 maxrev = 0
53 cmd = self.cmd
54 if self.rev: 43 if self.rev:
55 # TODO: handle tags 44 # TODO: handle tags
56 try: 45 try:
57 # patchset number? 46 # patchset number?
58 maxrev = int(self.rev) 47 maxrev = int(self.rev)
59 except ValueError: 48 except ValueError:
60 try: 49 raise util.Abort(_('revision %s is not a patchset number') % self.rev)
61 # date
62 util.parsedate(self.rev, ['%Y/%m/%d %H:%M:%S'])
63 cmd = '%s -d "1970/01/01 00:00:01" -d "%s"' % (cmd, self.rev)
64 except util.Abort:
65 raise util.Abort(_('revision %s is not a patchset number or date') % self.rev)
66 50
67 d = os.getcwd() 51 d = os.getcwd()
68 try: 52 try:
69 os.chdir(self.path) 53 os.chdir(self.path)
70 id = None 54 id = None
71 state = 0 55 state = 0
72 filerevids = {} 56 filerevids = {}
73 57
74 if self.builtin: 58 cache = 'update'
75 # builtin cvsps code 59 if not self.ui.configbool('convert', 'cvsps.cache', True):
76 self.ui.status(_('using builtin cvsps\n')) 60 cache = None
77 61 db = cvsps.createlog(self.ui, cache=cache)
78 cache = 'update' 62 db = cvsps.createchangeset(self.ui, db,
79 if not self.ui.configbool('convert', 'cvsps.cache', True): 63 fuzz=int(self.ui.config('convert', 'cvsps.fuzz', 60)),
80 cache = None 64 mergeto=self.ui.config('convert', 'cvsps.mergeto', None),
81 db = cvsps.createlog(self.ui, cache=cache) 65 mergefrom=self.ui.config('convert', 'cvsps.mergefrom', None))
82 db = cvsps.createchangeset(self.ui, db, 66
83 fuzz=int(self.ui.config('convert', 'cvsps.fuzz', 60)), 67 for cs in db:
84 mergeto=self.ui.config('convert', 'cvsps.mergeto', None), 68 if maxrev and cs.id>maxrev:
85 mergefrom=self.ui.config('convert', 'cvsps.mergefrom', None)) 69 break
86 70 id = str(cs.id)
87 for cs in db: 71 cs.author = self.recode(cs.author)
88 if maxrev and cs.id>maxrev: 72 self.lastbranch[cs.branch] = id
89 break 73 cs.comment = self.recode(cs.comment)
90 id = str(cs.id) 74 date = util.datestr(cs.date)
91 cs.author = self.recode(cs.author) 75 self.tags.update(dict.fromkeys(cs.tags, id))
92 self.lastbranch[cs.branch] = id 76
93 cs.comment = self.recode(cs.comment) 77 files = {}
94 date = util.datestr(cs.date) 78 for f in cs.entries:
95 self.tags.update(dict.fromkeys(cs.tags, id)) 79 files[f.file] = "%s%s" % ('.'.join([str(x) for x in f.revision]),
96 80 ['', '(DEAD)'][f.dead])
97 files = {} 81
98 for f in cs.entries: 82 # add current commit to set
99 files[f.file] = "%s%s" % ('.'.join([str(x) for x in f.revision]), 83 c = commit(author=cs.author, date=date,
100 ['', '(DEAD)'][f.dead]) 84 parents=[str(p.id) for p in cs.parents],
101 85 desc=cs.comment, branch=cs.branch or '')
102 # add current commit to set 86 self.changeset[id] = c
103 c = commit(author=cs.author, date=date, 87 self.files[id] = files
104 parents=[str(p.id) for p in cs.parents],
105 desc=cs.comment, branch=cs.branch or '')
106 self.changeset[id] = c
107 self.files[id] = files
108 else:
109 # external cvsps
110 for l in util.popen(cmd):
111 if state == 0: # header
112 if l.startswith("PatchSet"):
113 id = l[9:-2]
114 if maxrev and int(id) > maxrev:
115 # ignore everything
116 state = 3
117 elif l.startswith("Date:"):
118 date = util.parsedate(l[6:-1], ["%Y/%m/%d %H:%M:%S"])
119 date = util.datestr(date)
120 elif l.startswith("Branch:"):
121 branch = l[8:-1]
122 self.parent[id] = self.lastbranch.get(branch, 'bad')
123 self.lastbranch[branch] = id
124 elif l.startswith("Ancestor branch:"):
125 ancestor = l[17:-1]
126 # figure out the parent later
127 self.parent[id] = self.lastbranch[ancestor]
128 elif l.startswith("Author:"):
129 author = self.recode(l[8:-1])
130 elif l.startswith("Tag:") or l.startswith("Tags:"):
131 t = l[l.index(':')+1:]
132 t = [ut.strip() for ut in t.split(',')]
133 if (len(t) > 1) or (t[0] and (t[0] != "(none)")):
134 self.tags.update(dict.fromkeys(t, id))
135 elif l.startswith("Log:"):
136 # switch to gathering log
137 state = 1
138 log = ""
139 elif state == 1: # log
140 if l == "Members: \n":
141 # switch to gathering members
142 files = {}
143 oldrevs = []
144 log = self.recode(log[:-1])
145 state = 2
146 else:
147 # gather log
148 log += l
149 elif state == 2: # members
150 if l == "\n": # start of next entry
151 state = 0
152 p = [self.parent[id]]
153 if id == "1":
154 p = []
155 if branch == "HEAD":
156 branch = ""
157 if branch:
158 latest = 0
159 # the last changeset that contains a base
160 # file is our parent
161 for r in oldrevs:
162 latest = max(filerevids.get(r, 0), latest)
163 if latest:
164 p = [latest]
165
166 # add current commit to set
167 c = commit(author=author, date=date, parents=p,
168 desc=log, branch=branch)
169 self.changeset[id] = c
170 self.files[id] = files
171 else:
172 colon = l.rfind(':')
173 file = l[1:colon]
174 rev = l[colon+1:-2]
175 oldrev, rev = rev.split("->")
176 files[file] = rev
177
178 # save some information for identifying branch points
179 oldrevs.append("%s:%s" % (oldrev, file))
180 filerevids["%s:%s" % (rev, file)] = id
181 elif state == 3:
182 # swallow all input
183 continue
184 88
185 self.heads = self.lastbranch.values() 89 self.heads = self.lastbranch.values()
186 finally: 90 finally:
187 os.chdir(d) 91 os.chdir(d)
188 92