Beispiel #1
0
 def getauthor(self, ctx, gnode):
     try:
         user = ctx.user()
         if not self.fullauthorname:
             user = hglib.username(user)
         return user
     except error.Abort:
         return _('Mercurial User')
Beispiel #2
0
 def _getauthor(self, ctx):
     try:
         user = ctx.user()
         if not self._fullauthorname:
             user = hglib.username(user)
         return user
     except error.Abort:
         return _('Mercurial User')
Beispiel #3
0
 def get_rev_desc(self, rev):
     if rev in self.changedesc:
         return self.changedesc[rev]
     ctx = self.repo[rev]
     author = hglib.toutf(hglib.username(ctx.user()))
     date = hglib.toutf(hglib.displaytime(ctx.date()))
     text = hglib.tounicode(ctx.description()).replace(u'\0', '')
     lines = text.splitlines()
     summary = hglib.toutf(lines and lines[0] or '')
     desc = gtklib.markup_escape_text('%s@%s %s "%s"' % \
                                      (author, rev, date, summary))
     self.changedesc[rev] = (desc, author)
     return self.changedesc[rev]
Beispiel #4
0
 def preset_func(widget, item, ctx):
     if item == 'rev':
         revnum = self.get_data('revnum', *args)
         revid = self.get_data('revid', *args)
         if revid:
             return (revnum, revid)
         return None
     elif item == 'revnum':
         return ctx.rev()
     elif item == 'revid':
         return str(ctx)
     elif item == 'desc':
         return hglib.tounicode(ctx.description().replace('\0', ''))
     elif item == 'summary':
         summary = hglib.longsummary(
             ctx.description().replace('\0', ''))
         if len(summary) == 0:
             return None
         return summary
     elif item == 'user':
         user = hglib.user(ctx)
         if user:
             return hglib.tounicode(user)
         return None
     elif item == 'shortuser':
         return hglib.tounicode(hglib.username(hglib.user(ctx)))
     elif item == 'dateage':
         date = self.get_data('date', *args)
         age = self.get_data('age', *args)
         if date and age:
             return (date, age)
         return None
     elif item == 'date':
         date = ctx.date()
         if date:
             return hglib.displaytime(date)
         return None
     elif item == 'age':
         date = ctx.date()
         if date:
             return hglib.age(date).decode('utf-8')
         return None
     elif item == 'rawbranch':
         return ctx.branch() or None
     elif item == 'branch':
         value = self.get_data('rawbranch', *args)
         if value:
             repo = ctx._repo
             try:
                 if ctx.node() != repo.branchtip(ctx.branch()):
                     return None
             except error.RepoLookupError:
                 # ctx.branch() can be invalid for null or workingctx
                 return None
             if value in repo.deadbranches:
                 return None
             return value
         return None
     elif item == 'close':
         return ctx.extra().get('close')
     elif item == 'tags':
         return ctx.thgtags() or None
     elif item == 'graft':
         extra = ctx.extra()
         try:
             return extra['source']
         except KeyError:
             pass
         return None
     elif item == 'transplant':
         extra = ctx.extra()
         try:
             ts = extra['transplant_source']
             if ts:
                 return binascii.hexlify(ts)
         except KeyError:
             pass
         return None
     elif item == 'obsolete':
         obsoletestate = []
         if ctx.obsolete():
             obsoletestate.append('obsolete')
         if ctx.extinct():
             obsoletestate.append('extinct')
         obsoletestate += ctx.troubles()
         if obsoletestate:
             return obsoletestate
         return None
     elif item == 'p4':
         extra = ctx.extra()
         p4cl = extra.get('p4', None)
         return p4cl and ('changelist %s' % p4cl)
     elif item == 'svn':
         extra = ctx.extra()
         cvt = extra.get('convert_revision', '')
         if cvt.startswith('svn:'):
             result = cvt.split('/', 1)[-1]
             if cvt != result:
                 return result
             return cvt.split('@')[-1]
         else:
             return None
     elif item == 'converted':
         extra = ctx.extra()
         cvt = extra.get('convert_revision', '')
         if cvt and not cvt.startswith('svn:'):
             return cvt
         else:
             return None
     elif item == 'ishead':
         childbranches = [cctx.branch() for cctx in ctx.children()]
         return ctx.branch() not in childbranches
     elif item == 'mqoriginalparent':
         target = ctx.thgmqoriginalparent()
         if not target:
             return None
         p1 = ctx.p1()
         if p1 is not None and p1.hex() == target:
             return None
         if target not in ctx._repo:
             return None
         return target
     raise UnknownItem(item)
Beispiel #5
0
 def preset_func(widget, item, ctx):
     if item == "rev":
         revnum = self.get_data("revnum", *args)
         revid = self.get_data("revid", *args)
         if revid:
             return (revnum, revid)
         return None
     elif item == "revnum":
         return ctx.rev()
     elif item == "revid":
         return str(ctx)
     elif item == "desc":
         return hglib.tounicode(ctx.description().replace("\0", ""))
     elif item == "summary":
         summary = hglib.longsummary(ctx.description().replace("\0", ""))
         if len(summary) == 0:
             return None
         return summary
     elif item == "user":
         user = hglib.user(ctx)
         if user:
             return hglib.tounicode(user)
         return None
     elif item == "shortuser":
         return hglib.tounicode(hglib.username(hglib.user(ctx)))
     elif item == "dateage":
         date = self.get_data("date", *args)
         age = self.get_data("age", *args)
         if date and age:
             return (date, age)
         return None
     elif item == "date":
         date = ctx.date()
         if date:
             return hglib.displaytime(date)
         return None
     elif item == "age":
         date = ctx.date()
         if date:
             return hglib.age(date).decode("utf-8")
         return None
     elif item == "rawbranch":
         return ctx.branch() or None
     elif item == "branch":
         value = self.get_data("rawbranch", *args)
         if value:
             repo = ctx._repo
             if ctx.node() not in repo.branchtags().values():
                 return None
             if value in repo.deadbranches:
                 return None
             return value
         return None
     elif item == "close":
         return ctx.extra().get("close")
     elif item == "rawtags":
         return hglib.getrawctxtags(ctx)
     elif item == "tags":
         return hglib.getctxtags(ctx)
     elif item == "graft":
         extra = ctx.extra()
         try:
             return extra["source"]
         except KeyError:
             pass
         return None
     elif item == "transplant":
         extra = ctx.extra()
         try:
             ts = extra["transplant_source"]
             if ts:
                 return binascii.hexlify(ts)
         except KeyError:
             pass
         return None
     elif item == "obsolete":
         obsoletestate = []
         if ctx.obsolete():
             obsoletestate.append("obsolete")
         if ctx.extinct():
             obsoletestate.append("extinct")
         obsoletestate += ctx.troubles()
         if obsoletestate:
             return obsoletestate
         return None
     elif item == "p4":
         extra = ctx.extra()
         p4cl = extra.get("p4", None)
         return p4cl and ("changelist %s" % p4cl)
     elif item == "svn":
         extra = ctx.extra()
         cvt = extra.get("convert_revision", "")
         if cvt.startswith("svn:"):
             result = cvt.split("/", 1)[-1]
             if cvt != result:
                 return result
             return cvt.split("@")[-1]
         else:
             return None
     elif item == "converted":
         extra = ctx.extra()
         cvt = extra.get("convert_revision", "")
         if cvt and not cvt.startswith("svn:"):
             return cvt
         else:
             return None
     elif item == "ishead":
         childbranches = [cctx.branch() for cctx in ctx.children()]
         return ctx.branch() not in childbranches
     raise UnknownItem(item)
Beispiel #6
0
 def getauthor(fctx):
     return hglib.tounicode(hglib.username(fctx.user()))
Beispiel #7
0
    def on_get_value(self, rowref, column):
        (revid, graphnode, lines, path) = self.graphdata[rowref]

        if column == REVID: return revid
        if column == LINES: return lines
        if column == LAST_LINES:
            if rowref>0:
                return self.graphdata[rowref-1][2]
            return []
        if column == WFILE: return path or ''

        try:
            ctx = self.repo[revid]
        except IndexError:
            return None

        # non-cached columns

        if column in (HEXID, REVHEX, BRANCH, LOCALTIME, UTC):
            if column == HEXID:
                return str(ctx)
            if column == REVHEX:
                hexid = gtklib.markup(str(ctx), face='monospace')
                return '%s: %s' % (revid, hexid)
            if column == BRANCH:
                return ctx.branch()
            if column == LOCALTIME:
                return hglib.displaytime(ctx.date())
            if column == UTC:
                return hglib.utctime(ctx.date())

        # cached columns

        if revid not in self.revisions:
            self.revisions[revid] = {}
        cache = self.revisions[revid]

        if cache.has_key(column):
            return cache[column]

        if column in (COMMITER, FGCOLOR):
            cache[COMMITER] = hglib.toutf(hglib.username(ctx.user()))

        if column == TAGS:
            tags = self.repo.nodetags(ctx.node())
            cache[TAGS] = hglib.toutf(', '.join(tags))

        elif column == SVNREV:
            extra = ctx.extra()
            cvt = extra.get('convert_revision', '')
            if cvt.startswith('svn:'):
                rev = cvt.split('/', 1)[-1]
                rev = rev.split('@', 1)[-1]
            else:
                rev = None
            cache[SVNREV] = rev and hglib.toutf('r%s' % rev) or ''

        elif column == AGE:
            cache[AGE] = hglib.age(ctx.date())

        elif column == FGCOLOR:
            cache[FGCOLOR] = self.color_func(revid, cache[COMMITER])

        elif column == CHANGES:
            parent = self.parents.get(revid, None)
            if parent is None:
                parent = ctx.parents()[0].node()
            M, A, R = self.repo.status(parent, ctx.node())[:3]
            common = dict(color=gtklib.BLACK)
            M = M and gtklib.markup(' %s ' % len(M),
                             background=gtklib.PORANGE, **common) or ''
            A = A and gtklib.markup(' %s ' % len(A),
                             background=gtklib.PGREEN, **common) or ''
            R = R and gtklib.markup(' %s ' % len(R),
                             background=gtklib.PRED, **common) or ''
            cache[CHANGES] = ''.join((M, A, R))

        elif column in (MESSAGE, GRAPHNODE):
            # convert to Unicode for valid string operations
            summary = hglib.tounicode(ctx.description()).replace(u'\0', '')
            if self.longsummary:
                limit = 80
                lines = summary.splitlines()
                if lines:
                    summary = lines.pop(0)
                    while len(summary) < limit and lines:
                        summary += u'  ' + lines.pop(0)
                    summary = summary[0:limit]
                else:
                    summary = ''
            else:
                lines = summary.splitlines()
                summary = lines and lines[0] or ''
            escape = gtklib.markup_escape_text
            summary = escape(hglib.toutf(summary))

            tstr = ''
            for tag in ctx.tags():
                if tag not in self.hidetags:
                    if tag in self.mqpatches:
                        bg = gtklib.PBLUE
                    else:
                        bg = gtklib.PYELLOW
                    style = {'color': gtklib.BLACK, 'background': bg}
                    tstr += gtklib.markup(' %s ' % tag, **style) + ' '
            for mark in ctx.bookmarks():
                if mark == self.curbookmark:
                    bg = gtklib.PORANGE
                else:
                    bg = gtklib.PLIME
                style = {'color': gtklib.BLACK, 'background': bg}
                tstr += gtklib.markup(' %s ' % mark, **style) + ' '

            node = ctx.node()
            branch = ctx.branch()
            bstr = ''
            status = 0
            if self.branchtags.get(branch) == node:
                bstr += gtklib.markup(' %s ' % branch, color=gtklib.BLACK,
                                      background=gtklib.PGREEN) + ' '
                status = 8

            if revid in self.wcparents:
                sumstr = bstr + tstr + '<b><u>' + summary + '</u></b>'
                status += 4
            else:
                sumstr = bstr + tstr + summary
                status += 0

            if node in self.outgoing:
                # outgoing
                if not self.showgraph:
                    marker = hglib.toutf(u'\u2191 ') # up arrow
                    sumstr = marker + sumstr
                status += 1
            elif revid >= self.origtip:
                if revid >= len(self.repo) - self.npreviews:
                    # incoming
                    if not self.showgraph:
                        marker = hglib.toutf(u'\u2193 ') # down arrow
                        sumstr = marker + sumstr
                    status += 3
                else:
                    # new
                    status += 2

            cache[MESSAGE] = sumstr
            gcolumn, gcolor = graphnode
            cache[GRAPHNODE] = (gcolumn, gcolor, status)

        return cache[column]
Beispiel #8
0
 def getauthor(fctx):
     return hglib.tounicode(hglib.username(fctx.user()))
Beispiel #9
0
class _ChangesetsModel(QAbstractTableModel
                       ):  # TODO: use component of log viewer?
    _COLUMNS = [('rev', lambda ctx: '%d:%s' % (ctx.rev(), ctx)),
                ('author', lambda ctx: hglib.username(ctx.user())),
                ('date', lambda ctx: util.shortdate(ctx.date())),
                ('description', lambda ctx: ctx.longsummary())]

    def __init__(self, repo, revs, selectedrevs, parent=None):
        super(_ChangesetsModel, self).__init__(parent)
        self._repo = repo
        self._revs = list(reversed(sorted(revs)))
        self._selectedrevs = set(selectedrevs)
        self._readonly = False

    @property
    def revs(self):
        return self._revs

    @property
    def selectedrevs(self):
        """Return the list of selected revisions"""
        return list(sorted(self._selectedrevs))

    def isselectedall(self):
        return len(self._revs) == len(self._selectedrevs)

    def data(self, index, role):
        if not index.isValid():
            return QVariant()

        rev = self._revs[index.row()]
        if index.column() == 0 and role == Qt.CheckStateRole:
            return rev in self._selectedrevs and Qt.Checked or Qt.Unchecked
        if role == Qt.DisplayRole:
            coldata = self._COLUMNS[index.column()][1]
            return QVariant(hglib.tounicode(coldata(
                self._repo.changectx(rev))))

        return QVariant()

    def setData(self, index, value, role=Qt.EditRole):
        if not index.isValid() or self._readonly:
            return False

        rev = self._revs[index.row()]
        if index.column() == 0 and role == Qt.CheckStateRole:
            origvalue = rev in self._selectedrevs
            if value == Qt.Checked:
                self._selectedrevs.add(rev)
            else:
                self._selectedrevs.remove(rev)

            if origvalue != (rev in self._selectedrevs):
                self.dataChanged.emit(index, index)

            return True

        return False

    def setReadOnly(self, readonly):
        self._readonly = readonly

    def flags(self, index):
        v = super(_ChangesetsModel, self).flags(index)
        if index.column() == 0 and not self._readonly:
            return Qt.ItemIsUserCheckable | v
        else:
            return v

    def rowCount(self, parent=QModelIndex()):
        if parent.isValid():
            return 0  # no child
        return len(self._revs)

    def columnCount(self, parent=QModelIndex()):
        if parent.isValid():
            return 0  # no child
        return len(self._COLUMNS)

    def headerData(self, section, orientation, role):
        if role != Qt.DisplayRole or orientation != Qt.Horizontal:
            return QVariant()

        return QVariant(self._COLUMNS[section][0].capitalize())

    def selectAll(self):
        self._selectedrevs = set(self._revs)
        self.updateAll()

    def selectNone(self):
        self._selectedrevs = set()
        self.updateAll()

    def updateAll(self):
        first = self.createIndex(0, 0)
        last = self.createIndex(len(self._revs) - 1, 0)
        self.dataChanged.emit(first, last)
Beispiel #10
0
 def preset_func(widget, item, ctx):
     if item == "rev":
         revnum = self.get_data("revnum", *args)
         revid = self.get_data("revid", *args)
         if revid:
             return (revnum, revid)
         return None
     elif item == "revnum":
         return ctx.rev()
     elif item == "revid":
         return str(ctx)
     elif item == "desc":
         return hglib.toutf(ctx.description().replace("\0", ""))
     elif item == "summary":
         value = ctx.description().replace("\0", "").split("\n")[0]
         if len(value) == 0:
             return None
         return hglib.toutf(hglib.tounicode(value)[:80])
     elif item == "user":
         return hglib.toutf(ctx.user())
     elif item == "shortuser":
         return hglib.toutf(hglib.username(ctx.user()))
     elif item == "dateage":
         date = self.get_data("date", *args)
         age = self.get_data("age", *args)
         if date and age:
             return (date, age)
         return None
     elif item == "date":
         date = ctx.date()
         if date:
             return hglib.displaytime(date)
         return None
     elif item == "age":
         date = ctx.date()
         if date:
             return hglib.age(date)
         return None
     elif item == "rawbranch":
         value = ctx.branch()
         if value:
             return hglib.toutf(value)
         return None
     elif item == "branch":
         value = self.get_data("rawbranch", *args)
         if value:
             repo = ctx._repo
             if ctx.node() not in repo.branchtags().values():
                 return None
             dblist = hglib.getdeadbranch(repo.ui)
             if value in dblist:
                 return None
             return value
         return None
     elif item == "rawtags":
         value = [hglib.toutf(tag) for tag in ctx.tags()]
         if len(value) == 0:
             return None
         return value
     elif item == "tags":
         value = self.get_data("rawtags", *args)
         if value:
             htlist = hglib.gethidetags(ctx._repo.ui)
             tags = [tag for tag in value if tag not in htlist]
             if len(tags) == 0:
                 return None
             return tags
         return None
     elif item == "transplant":
         extra = ctx.extra()
         try:
             ts = extra["transplant_source"]
             if ts:
                 return binascii.hexlify(ts)
         except KeyError:
             pass
         return None
     elif item == "p4":
         extra = ctx.extra()
         p4cl = extra.get("p4", None)
         return p4cl and ("changelist %s" % p4cl)
     elif item == "svn":
         extra = ctx.extra()
         cvt = extra.get("convert_revision", "")
         if cvt.startswith("svn:"):
             result = cvt.split("/", 1)[-1]
             if cvt != result:
                 return result
             return cvt.split("@")[-1]
         else:
             return None
     elif item == "ishead":
         childbranches = [cctx.branch() for cctx in ctx.children()]
         return ctx.branch() not in childbranches
     raise UnknownItem(item)
Beispiel #11
0
 def preset_func(widget, item, ctx):
     if item == 'rev':
         revnum = self.get_data('revnum', *args)
         revid = self.get_data('revid', *args)
         if revid:
             return (revnum, revid)
         return None
     elif item == 'revnum':
         return ctx.rev()
     elif item == 'revid':
         return str(ctx)
     elif item == 'desc':
         return hglib.tounicode(ctx.description().replace('\0', ''))
     elif item == 'summary':
         value = ctx.description().replace('\0', '').split('\n')[0]
         if len(value) == 0:
             return None
         return hglib.tounicode(value)[:80]
     elif item == 'user':
         user = hglib.user(ctx)
         if user:
             return hglib.tounicode(user)
         return None
     elif item == 'shortuser':
         return hglib.tounicode(hglib.username(hglib.user(ctx)))
     elif item == 'dateage':
         date = self.get_data('date', *args)
         age = self.get_data('age', *args)
         if date and age:
             return (date, age)
         return None
     elif item == 'date':
         date = ctx.date()
         if date:
             return hglib.displaytime(date)
         return None
     elif item == 'age':
         date = ctx.date()
         if date:
             return hglib.age(date).decode('utf-8')
         return None
     elif item == 'rawbranch':
         return ctx.branch() or None
     elif item == 'branch':
         value = self.get_data('rawbranch', *args)
         if value:
             repo = ctx._repo
             if ctx.node() not in repo.branchtags().values():
                 return None
             if value in repo.deadbranches:
                 return None
             return value
         return None
     elif item == 'close':
         return ctx.extra().get('close')
     elif item == 'rawtags':
         return hglib.getrawctxtags(ctx)
     elif item == 'tags':
         return hglib.getctxtags(ctx)
     elif item == 'graft':
         extra = ctx.extra()
         try:
             return extra['source']
         except KeyError:
             pass
         return None
     elif item == 'transplant':
         extra = ctx.extra()
         try:
             ts = extra['transplant_source']
             if ts:
                 return binascii.hexlify(ts)
         except KeyError:
             pass
         return None
     elif item == 'p4':
         extra = ctx.extra()
         p4cl = extra.get('p4', None)
         return p4cl and ('changelist %s' % p4cl)
     elif item == 'svn':
         extra = ctx.extra()
         cvt = extra.get('convert_revision', '')
         if cvt.startswith('svn:'):
             result = cvt.split('/', 1)[-1]
             if cvt != result:
                 return result
             return cvt.split('@')[-1]
         else:
             return None
     elif item == 'converted':
         extra = ctx.extra()
         cvt = extra.get('convert_revision', '')
         if cvt and not cvt.startswith('svn:'):
             return cvt
         else:
             return None
     elif item == 'ishead':
         childbranches = [cctx.branch() for cctx in ctx.children()]
         return ctx.branch() not in childbranches
     raise UnknownItem(item)
Beispiel #12
0
 def getauthor(self, ctx, gnode):
     try:
         return hglib.username(ctx.user())
     except error.Abort:
         return _("Mercurial User")
Beispiel #13
0
 def getauthor(self, ctx, gnode):
     try:
         return hglib.username(ctx.user())
     except error.Abort:
         return _('Mercurial User')