43 |
43 |
44 def __init__(self, ui, repotype, path, revs=None): |
44 def __init__(self, ui, repotype, path, revs=None): |
45 super(gnuarch_source, self).__init__(ui, repotype, path, revs=revs) |
45 super(gnuarch_source, self).__init__(ui, repotype, path, revs=revs) |
46 |
46 |
47 if not os.path.exists(os.path.join(path, '{arch}')): |
47 if not os.path.exists(os.path.join(path, '{arch}')): |
48 raise common.NoRepo(_("%s does not look like a GNU Arch repository") |
48 raise common.NoRepo( |
49 % path) |
49 _("%s does not look like a GNU Arch repository") % path |
|
50 ) |
50 |
51 |
51 # Could use checktool, but we want to check for baz or tla. |
52 # Could use checktool, but we want to check for baz or tla. |
52 self.execmd = None |
53 self.execmd = None |
53 if procutil.findexe('baz'): |
54 if procutil.findexe('baz'): |
54 self.execmd = 'baz' |
55 self.execmd = 'baz' |
72 self.encoding = encoding.encoding |
73 self.encoding = encoding.encoding |
73 self.archives = [] |
74 self.archives = [] |
74 |
75 |
75 def before(self): |
76 def before(self): |
76 # Get registered archives |
77 # Get registered archives |
77 self.archives = [i.rstrip('\n') |
78 self.archives = [ |
78 for i in self.runlines0('archives', '-n')] |
79 i.rstrip('\n') for i in self.runlines0('archives', '-n') |
|
80 ] |
79 |
81 |
80 if self.execmd == 'tla': |
82 if self.execmd == 'tla': |
81 output = self.run0('tree-version', self.path) |
83 output = self.run0('tree-version', self.path) |
82 else: |
84 else: |
83 output = self.run0('tree-version', '-d', self.path) |
85 output = self.run0('tree-version', '-d', self.path) |
84 self.treeversion = output.strip() |
86 self.treeversion = output.strip() |
85 |
87 |
86 # Get name of temporary directory |
88 # Get name of temporary directory |
87 version = self.treeversion.split('/') |
89 version = self.treeversion.split('/') |
88 self.tmppath = os.path.join(pycompat.fsencode(tempfile.gettempdir()), |
90 self.tmppath = os.path.join( |
89 'hg-%s' % version[1]) |
91 pycompat.fsencode(tempfile.gettempdir()), 'hg-%s' % version[1] |
|
92 ) |
90 |
93 |
91 # Generate parents dictionary |
94 # Generate parents dictionary |
92 self.parents[None] = [] |
95 self.parents[None] = [] |
93 treeversion = self.treeversion |
96 treeversion = self.treeversion |
94 child = None |
97 child = None |
95 while treeversion: |
98 while treeversion: |
96 self.ui.status(_('analyzing tree version %s...\n') % treeversion) |
99 self.ui.status(_('analyzing tree version %s...\n') % treeversion) |
97 |
100 |
98 archive = treeversion.split('/')[0] |
101 archive = treeversion.split('/')[0] |
99 if archive not in self.archives: |
102 if archive not in self.archives: |
100 self.ui.status(_('tree analysis stopped because it points to ' |
103 self.ui.status( |
101 'an unregistered archive %s...\n') % archive) |
104 _( |
|
105 'tree analysis stopped because it points to ' |
|
106 'an unregistered archive %s...\n' |
|
107 ) |
|
108 % archive |
|
109 ) |
102 break |
110 break |
103 |
111 |
104 # Get the complete list of revisions for that tree version |
112 # Get the complete list of revisions for that tree version |
105 output, status = self.runlines('revisions', '-r', '-f', treeversion) |
113 output, status = self.runlines('revisions', '-r', '-f', treeversion) |
106 self.checkexit(status, 'failed retrieving revisions for %s' |
114 self.checkexit( |
107 % treeversion) |
115 status, 'failed retrieving revisions for %s' % treeversion |
|
116 ) |
108 |
117 |
109 # No new iteration unless a revision has a continuation-of header |
118 # No new iteration unless a revision has a continuation-of header |
110 treeversion = None |
119 treeversion = None |
111 |
120 |
112 for l in output: |
121 for l in output: |
115 self.parents[rev] = [] |
124 self.parents[rev] = [] |
116 |
125 |
117 # Read author, date and summary |
126 # Read author, date and summary |
118 catlog, status = self.run('cat-log', '-d', self.path, rev) |
127 catlog, status = self.run('cat-log', '-d', self.path, rev) |
119 if status: |
128 if status: |
120 catlog = self.run0('cat-archive-log', rev) |
129 catlog = self.run0('cat-archive-log', rev) |
121 self._parsecatlog(catlog, rev) |
130 self._parsecatlog(catlog, rev) |
122 |
131 |
123 # Populate the parents map |
132 # Populate the parents map |
124 self.parents[child].append(rev) |
133 self.parents[child].append(rev) |
125 |
134 |
130 # Check if we have to follow the usual incremental history |
139 # Check if we have to follow the usual incremental history |
131 # or if we have to 'jump' to a different treeversion given |
140 # or if we have to 'jump' to a different treeversion given |
132 # by the continuation-of header. |
141 # by the continuation-of header. |
133 if self.changes[rev].continuationof: |
142 if self.changes[rev].continuationof: |
134 treeversion = '--'.join( |
143 treeversion = '--'.join( |
135 self.changes[rev].continuationof.split('--')[:-1]) |
144 self.changes[rev].continuationof.split('--')[:-1] |
|
145 ) |
136 break |
146 break |
137 |
147 |
138 # If we reached a base-0 revision w/o any continuation-of |
148 # If we reached a base-0 revision w/o any continuation-of |
139 # header, it means the tree history ends here. |
149 # header, it means the tree history ends here. |
140 if rev[-6:] == 'base-0': |
150 if rev[-6:] == 'base-0': |
187 self.lastrev = rev |
197 self.lastrev = rev |
188 return sorted(set(changes)), copies, set() |
198 return sorted(set(changes)), copies, set() |
189 |
199 |
190 def getcommit(self, rev): |
200 def getcommit(self, rev): |
191 changes = self.changes[rev] |
201 changes = self.changes[rev] |
192 return common.commit(author=changes.author, date=changes.date, |
202 return common.commit( |
193 desc=changes.summary, parents=self.parents[rev], |
203 author=changes.author, |
194 rev=rev) |
204 date=changes.date, |
|
205 desc=changes.summary, |
|
206 parents=self.parents[rev], |
|
207 rev=rev, |
|
208 ) |
195 |
209 |
196 def gettags(self): |
210 def gettags(self): |
197 return self.tags |
211 return self.tags |
198 |
212 |
199 def _execute(self, cmd, *args, **kwargs): |
213 def _execute(self, cmd, *args, **kwargs): |
205 self.ui.debug(cmdline, '\n') |
219 self.ui.debug(cmdline, '\n') |
206 return os.system(pycompat.rapply(procutil.tonativestr, cmdline)) |
220 return os.system(pycompat.rapply(procutil.tonativestr, cmdline)) |
207 |
221 |
208 def _update(self, rev): |
222 def _update(self, rev): |
209 self.ui.debug('applying revision %s...\n' % rev) |
223 self.ui.debug('applying revision %s...\n' % rev) |
210 changeset, status = self.runlines('replay', '-d', self.tmppath, |
224 changeset, status = self.runlines('replay', '-d', self.tmppath, rev) |
211 rev) |
|
212 if status: |
225 if status: |
213 # Something went wrong while merging (baz or tla |
226 # Something went wrong while merging (baz or tla |
214 # issue?), get latest revision and try from there |
227 # issue?), get latest revision and try from there |
215 shutil.rmtree(self.tmppath, ignore_errors=True) |
228 shutil.rmtree(self.tmppath, ignore_errors=True) |
216 self._obtainrevision(rev) |
229 self._obtainrevision(rev) |
217 else: |
230 else: |
218 old_rev = self.parents[rev][0] |
231 old_rev = self.parents[rev][0] |
219 self.ui.debug('computing changeset between %s and %s...\n' |
232 self.ui.debug( |
220 % (old_rev, rev)) |
233 'computing changeset between %s and %s...\n' % (old_rev, rev) |
|
234 ) |
221 self._parsechangeset(changeset, rev) |
235 self._parsechangeset(changeset, rev) |
222 |
236 |
223 def _getfile(self, name, rev): |
237 def _getfile(self, name, rev): |
224 mode = os.lstat(os.path.join(self.tmppath, name)).st_mode |
238 mode = os.lstat(os.path.join(self.tmppath, name)).st_mode |
225 if stat.S_ISLNK(mode): |
239 if stat.S_ISLNK(mode): |
284 try: |
298 try: |
285 catlog = self.catlogparser.parsestr(data) |
299 catlog = self.catlogparser.parsestr(data) |
286 |
300 |
287 # Commit date |
301 # Commit date |
288 self.changes[rev].date = dateutil.datestr( |
302 self.changes[rev].date = dateutil.datestr( |
289 dateutil.strdate(catlog['Standard-date'], |
303 dateutil.strdate(catlog['Standard-date'], '%Y-%m-%d %H:%M:%S') |
290 '%Y-%m-%d %H:%M:%S')) |
304 ) |
291 |
305 |
292 # Commit author |
306 # Commit author |
293 self.changes[rev].author = self.recode(catlog['Creator']) |
307 self.changes[rev].author = self.recode(catlog['Creator']) |
294 |
308 |
295 # Commit description |
309 # Commit description |
296 self.changes[rev].summary = '\n\n'.join((catlog['Summary'], |
310 self.changes[rev].summary = '\n\n'.join( |
297 catlog.get_payload())) |
311 (catlog['Summary'], catlog.get_payload()) |
|
312 ) |
298 self.changes[rev].summary = self.recode(self.changes[rev].summary) |
313 self.changes[rev].summary = self.recode(self.changes[rev].summary) |
299 |
314 |
300 # Commit revision origin when dealing with a branch or tag |
315 # Commit revision origin when dealing with a branch or tag |
301 if 'Continuation-of' in catlog: |
316 if 'Continuation-of' in catlog: |
302 self.changes[rev].continuationof = self.recode( |
317 self.changes[rev].continuationof = self.recode( |
303 catlog['Continuation-of']) |
318 catlog['Continuation-of'] |
|
319 ) |
304 except Exception: |
320 except Exception: |
305 raise error.Abort(_('could not parse cat-log of %s') % rev) |
321 raise error.Abort(_('could not parse cat-log of %s') % rev) |
306 |
322 |
307 def _parsechangeset(self, data, rev): |
323 def _parsechangeset(self, data, rev): |
308 for l in data: |
324 for l in data: |