class SVNAnnotate(Annotate):
    def __init__(self, path, revision=None):
        Annotate.__init__(self, path, revision)
        self.svn = self.vcs.svn()
        self.path = path
        self.show_revision(forceload=True)

    #
    # Helper methods
    #

    def load(self, revision):
        revision = revision.lower()
        rev = self.svn.revision("HEAD")
        if revision.isdigit():
            rev = self.svn.revision("number", number=int(revision))

        self.launch_loading()

        self.action = SVNAction(self.svn, notification=False)

        self.action.append(self.svn.annotate, self.path, to_revision=rev)

        if not self.log_by_order:
            self.action.append(self.svn.log, self.path)
            self.action.append(self.set_log)

        self.action.append(self.populate_table)
        self.action.append(self.enable_saveas)
        self.action.schedule()

        self.kill_loading()

    def blame_info(self, item):
        revision = item["revision"].number
        if revision <= 0:
            return ("", "", "")

        revision = str(revision)

        # remove fractional seconds and timezone information from
        # the end of the string provided by pysvn:
        # * timezone should be always "Z" (for UTC), "%Z" is not yet
        #   yet supported by strptime
        # * fractional could be parsed with "%f" since python 2.6
        #   but this precision is not needed anyway
        # * the datetime module does not include strptime until python 2.4
        #   so this workaround is required for now
        datestr = item["date"][0:-8]
        try:
            date = datetime(*time.strptime(datestr, "%Y-%m-%dT%H:%M:%S")[:-2])
            date = helper.format_datetime(date, self.datetime_format)
        except:
            date = ""

        return revision, date, S(item["author"].strip())

    def populate_table(self):
        blamedict = self.action.get_result(0)
        lines = highlight(self.path, [item["line"] for item in blamedict])

        self.table.clear()
        for i, item in enumerate(blamedict):
            revision, date, author = self.blame_info(item)
            author_color = self.author_background.get(author, "#FFFFFF")
            try:
                revision_color = self.log_by_revision[revision].background
            except KeyError:
                revision_color = "#FFFFFF"

            self.table.append([
                revision, author, date,
                str(int(item["number"]) + 1), lines[i], revision_color,
                author_color
            ])

    def generate_string_from_result(self):
        blamedict = self.action.get_result(0)

        text = ""
        for item in blamedict:
            revision, date, author = self.blame_info(item)

            text += "%s\t%s\t%s\t%s\t%s\n" % (str(int(item["number"]) + 1),
                                              revision, author, date,
                                              item["line"])

        return text

    def short_revision(self, revision):
        revision = str(revision).lower()
        return revision if revision != "head" else "HEAD"
Example #2
0
class SVNAnnotate(Annotate):
    def __init__(self, path, revision=None):
        Annotate.__init__(self, path, revision)

        self.svn = self.vcs.svn()

        if revision is None:
            revision = "HEAD"
        
        self.path = path
        self.get_widget("from").set_text(str(1))
        self.get_widget("to").set_text(str(revision))

        self.table = rabbitvcs.ui.widget.Table(
            self.get_widget("table"),
            [gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, 
                gobject.TYPE_STRING, gobject.TYPE_STRING], 
            [_("Line"), _("Revision"), _("Author"), 
                _("Date"), _("Text")]
        )
        self.table.allow_multiple()
        
        self.load()

    #
    # Helper methods
    #
    
    def load(self):
        from_rev_num = self.get_widget("from").get_text().lower()
        to_rev_num = self.get_widget("to").get_text().lower()
        
        if not from_rev_num.isdigit():
            MessageBox(_("The from revision field must be an integer"))
            return
             
        from_rev = self.svn.revision("number", number=int(from_rev_num))
        
        to_rev = self.svn.revision("head")
        if to_rev_num.isdigit():
            to_rev = self.svn.revision("number", number=int(to_rev_num))
        
        self.action = SVNAction(
            self.svn,
            notification=False
        )    

        self.action.append(
            self.svn.annotate,
            self.path,
            from_rev,
            to_rev
        )
        self.action.append(self.populate_table)
        self.action.append(self.enable_saveas)
        self.action.start()

    @gtk_unsafe
    def populate_table(self):
        blamedict = self.action.get_result(0)

        self.table.clear()
        for item in blamedict:            
            # remove fractional seconds and timezone information from 
            # the end of the string provided by pysvn:
            # * timezone should be always "Z" (for UTC), "%Z" is not yet
            #   yet supported by strptime
            # * fractional could be parsed with "%f" since python 2.6 
            #   but this precision is not needed anyway 
            # * the datetime module does not include strptime until python 2.4
            #   so this workaround is required for now
            datestr = item["date"][0:-8]
            date = datetime(*time.strptime(datestr,"%Y-%m-%dT%H:%M:%S")[:-2])
                
            self.table.append([
                item["number"],
                item["revision"].number,
                item["author"],
                rabbitvcs.util.helper.format_datetime(date),
                item["line"]
            ])
            
    def generate_string_from_result(self):
        blamedict = self.action.get_result(0)
        
        text = ""
        for item in blamedict:
            datestr = item["date"][0:-8]
            date = datetime(*time.strptime(datestr,"%Y-%m-%dT%H:%M:%S")[:-2])
            
            text += "%s\t%s\t%s\t%s\t%s\n" % (
                item["number"],
                item["revision"].number,
                item["author"],
                rabbitvcs.util.helper.format_datetime(date),
                item["line"]
            )
        
        return text
Example #3
0
class SVNAnnotate(Annotate):
    def __init__(self, path, revision=None):
        Annotate.__init__(self, path, revision)

        self.svn = self.vcs.svn()

        if revision is None:
            revision = "HEAD"

        self.path = path
        self.get_widget("from").set_text(str(1))
        self.get_widget("to").set_text(str(revision))

        self.table = rabbitvcs.ui.widget.Table(self.get_widget("table"), [
            GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING,
            GObject.TYPE_STRING, GObject.TYPE_STRING
        ], [_("Line"),
            _("Revision"),
            _("Author"),
            _("Date"),
            _("Text")])
        self.table.allow_multiple()

        self.loading_dialog = None

        self.load()

    #
    # Helper methods
    #

    def load(self):
        from_rev_num = self.get_widget("from").get_text().lower()
        to_rev_num = self.get_widget("to").get_text().lower()

        if not from_rev_num.isdigit():
            MessageBox(_("The from revision field must be an integer"))
            return

        from_rev = self.svn.revision("number", number=int(from_rev_num))

        to_rev = self.svn.revision("head")
        if to_rev_num.isdigit():
            to_rev = self.svn.revision("number", number=int(to_rev_num))

        self.launch_loading()

        self.action = SVNAction(self.svn, notification=False)

        self.action.append(self.svn.annotate, self.path, from_rev, to_rev)
        self.action.append(self.populate_table)
        self.action.append(self.enable_saveas)
        self.action.schedule()

        self.kill_loading()

    @gtk_unsafe
    def populate_table(self):
        blamedict = self.action.get_result(0)

        self.table.clear()
        for item in blamedict:
            # remove fractional seconds and timezone information from
            # the end of the string provided by pysvn:
            # * timezone should be always "Z" (for UTC), "%Z" is not yet
            #   yet supported by strptime
            # * fractional could be parsed with "%f" since python 2.6
            #   but this precision is not needed anyway
            # * the datetime module does not include strptime until python 2.4
            #   so this workaround is required for now
            datestr = item["date"][0:-8]
            date = datetime(*time.strptime(datestr, "%Y-%m-%dT%H:%M:%S")[:-2])
            self.table.append([
                str(int(item["number"]) + 1),
                str(item["revision"].number), item["author"],
                rabbitvcs.util.helper.format_datetime(date), item["line"]
            ])

    def generate_string_from_result(self):
        blamedict = self.action.get_result(0)

        text = ""
        for item in blamedict:
            datestr = item["date"][0:-8]
            date = datetime(*time.strptime(datestr, "%Y-%m-%dT%H:%M:%S")[:-2])

            text += "%s\t%s\t%s\t%s\t%s\n" % (
                str(int(item["number"]) + 1), str(
                    item["revision"].number), item["author"],
                rabbitvcs.util.helper.format_datetime(date), item["line"])

        return text