Mercurial > hg
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 |