hgext/imerge.py
changeset 5054 ec70fd08e16c
parent 5042 58006f8b8275
child 5055 56d48aed1f69
child 5063 86327d13d916
equal deleted inserted replaced
5053:47a8ea1eb2c3 5054:ec70fd08e16c
    65         return self.parents[1].node() != nullid
    65         return self.parents[1].node() != nullid
    66 
    66 
    67     def load(self):
    67     def load(self):
    68         # status format. \0-delimited file, fields are
    68         # status format. \0-delimited file, fields are
    69         # p1, p2, conflict count, conflict filenames, resolved filenames
    69         # p1, p2, conflict count, conflict filenames, resolved filenames
    70         # conflict filenames are pairs of localname, remotename
    70         # conflict filenames are tuples of localname, remoteorig, remotenew
    71 
    71 
    72         statusfile = self.opener('status')
    72         statusfile = self.opener('status')
    73 
    73 
    74         status = statusfile.read().split('\0')
    74         status = statusfile.read().split('\0')
    75         if len(status) < 3:
    75         if len(status) < 3:
    79             self.parents = [self.repo.changectx(n) for n in status[:2]]
    79             self.parents = [self.repo.changectx(n) for n in status[:2]]
    80         except LookupError:
    80         except LookupError:
    81             raise util.Abort('merge parent %s not in repository' % short(p))
    81             raise util.Abort('merge parent %s not in repository' % short(p))
    82 
    82 
    83         status = status[2:]
    83         status = status[2:]
    84         conflicts = int(status.pop(0)) * 2
    84         conflicts = int(status.pop(0)) * 3
    85         self.resolved = status[conflicts:]
    85         self.resolved = status[conflicts:]
    86         for i in xrange(0, conflicts, 2):
    86         for i in xrange(0, conflicts, 3):
    87             self.conflicts[status[i]] = status[i+1]
    87             self.conflicts[status[i]] = (status[i+1], status[i+2])
    88 
    88 
    89     def save(self):
    89     def save(self):
    90         lock = self.repo.lock()
    90         lock = self.repo.lock()
    91 
    91 
    92         if not os.path.isdir(self.path):
    92         if not os.path.isdir(self.path):
    95 
    95 
    96         out = [hex(n.node()) for n in self.parents]
    96         out = [hex(n.node()) for n in self.parents]
    97         out.append(str(len(self.conflicts)))
    97         out.append(str(len(self.conflicts)))
    98         for f in sorted(self.conflicts):
    98         for f in sorted(self.conflicts):
    99             out.append(f)
    99             out.append(f)
   100             out.append(self.conflicts[f])
   100             out.extend(self.conflicts[f])
   101         out.extend(self.resolved)
   101         out.extend(self.resolved)
   102 
   102 
   103         fd.write('\0'.join(out))
   103         fd.write('\0'.join(out))
   104 
   104 
   105     def remaining(self):
   105     def remaining(self):
   106         return [f for f in self.conflicts if f not in self.resolved]
   106         return [f for f in self.conflicts if f not in self.resolved]
   107 
   107 
   108     def filemerge(self, fn):
   108     def filemerge(self, fn):
   109         wlock = self.repo.wlock()
   109         wlock = self.repo.wlock()
   110 
   110 
   111         fo = self.conflicts[fn]
   111         (fd, fo) = self.conflicts[fn]
   112         return merge.filemerge(self.repo, fn, fo, self.parents[0],
   112         return merge.filemerge(self.repo, fn, fd, fo, self.parents[0],
   113                                self.parents[1])
   113                                self.parents[1])
   114 
   114 
   115     def start(self, rev=None):
   115     def start(self, rev=None):
   116         _filemerge = merge.filemerge
   116         _filemerge = merge.filemerge
   117         def filemerge(repo, fw, fo, wctx, mctx):
   117         def filemerge(repo, fw, fd, fo, wctx, mctx):
   118             self.conflicts[fw] = fo
   118             self.conflicts[fw] = (fd, fo)
   119 
   119 
   120         merge.filemerge = filemerge
   120         merge.filemerge = filemerge
   121         commands.merge(self.ui, self.repo, rev=rev)
   121         commands.merge(self.ui, self.repo, rev=rev)
   122         merge.filemerge = _filemerge
   122         merge.filemerge = _filemerge
   123 
   123 
   143                 self.ui.write('  %s\n' % fn)
   143                 self.ui.write('  %s\n' % fn)
   144         remaining = [f for f in self.conflicts if f not in self.resolved]
   144         remaining = [f for f in self.conflicts if f not in self.resolved]
   145         if remaining:
   145         if remaining:
   146             self.ui.write('remaining:\n')
   146             self.ui.write('remaining:\n')
   147             for fn in remaining:
   147             for fn in remaining:
   148                 fo = self.conflicts[fn]
   148                 (fd, fo) = self.conflicts[fn]
   149                 if fn == fo:
   149                 if fn == fo:
   150                     self.ui.write('  %s\n' % (fn,))
   150                     self.ui.write('  %s\n' % (fn,))
   151                 else:
   151                 else:
   152                     self.ui.write('  %s (%s)\n' % (fn, fo))
   152                     self.ui.write('  %s (%s)\n' % (fn, fd))
   153         else:
   153         else:
   154             self.ui.write('all conflicts resolved\n')
   154             self.ui.write('all conflicts resolved\n')
   155 
   155 
   156     def next(self):
   156     def next(self):
   157         remaining = self.remaining()
   157         remaining = self.remaining()