hgext/convert/gnuarch.py
changeset 43076 2372284d9457
parent 43072 058c2468b2f5
child 43077 687b865b95ad
equal deleted inserted replaced
43075:57875cf423c9 43076:2372284d9457
    24     dateutil,
    24     dateutil,
    25     procutil,
    25     procutil,
    26 )
    26 )
    27 from . import common
    27 from . import common
    28 
    28 
       
    29 
    29 class gnuarch_source(common.converter_source, common.commandline):
    30 class gnuarch_source(common.converter_source, common.commandline):
    30 
       
    31     class gnuarch_rev(object):
    31     class gnuarch_rev(object):
    32         def __init__(self, rev):
    32         def __init__(self, rev):
    33             self.rev = rev
    33             self.rev = rev
    34             self.summary = ''
    34             self.summary = ''
    35             self.date = None
    35             self.date = None
    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: