예제 #1
0
 def _sort_on_date(self, patches):
     ''' Sort patches on date field. The format is like:
             Fri, 28 Dec 2012 21:00:31 +0200
     '''
     records = []
     for patch in patches:
         strings = ut.read_strings(ut.join_path(self.patchdir, patch))
         for string in strings:
             if ("Date:" in string): # e.g. 'Date: Wed, 16 Jan 2013 19:09:47 +0000'
                 fields = ut.string_to_words(string[6:].lstrip(' \t'))
                 _, s_day, s_mon, s_year, s_hms, _ = fields
                 s_hour, s_minute, s_second = s_hms.split(':')
                 day, year = int(s_day), int(s_year)
                 hour, minute, second = int(s_hour), int(s_minute), int(s_second)
                 month = self.month_numbers[s_mon]
                 # ignoring microseconds
                 dt = datetime(year, month, day, hour, minute, second) 
                 records += [(dt, patch)]
                 break
     
     records = sorted(records, key = lambda r: r[0])
     
     patches = [patch for (_, patch) in records]
     
     return patches
예제 #2
0
 def list_files(patchpath):
     """ List the files referenced by a patch, without duplicates
     
     Args:
         patchpath (string) path to patch file
         
     Returns:
         list of filenames
         
     Notes:
         A "filename" is the portion of the file's path after the kernel root,
         e.g. "drivers/iio/...".
     """
     #--
     
     strings = ut.read_strings(patchpath)
     files = {}
     for string in strings:
         if (string.startswith('diff --git ')):
             filename = ut.get_string_filename(string)
             files[filename] = True
     
     filenames = sorted(files)   # 2to3
     
     return filenames
예제 #3
0
    def list_files(patchpath):
        """ List the files referenced by a patch, without duplicates
        
        Args:
            patchpath (string) path to patch file
            
        Returns:
            list of filenames
            
        Notes:
            A "filename" is the portion of the file's path after the kernel root,
            e.g. "drivers/iio/...".
        """
        #--

        strings = ut.read_strings(patchpath)
        files = {}
        for string in strings:
            if (string.startswith('diff --git ')):
                filename = ut.get_string_filename(string)
                files[filename] = True

        filenames = sorted(files)  # 2to3

        return filenames
예제 #4
0
    def _sort_on_date(self, patches):
        ''' Sort patches on date field. The format is like:
                Fri, 28 Dec 2012 21:00:31 +0200
        '''
        records = []
        for patch in patches:
            strings = ut.read_strings(ut.join_path(self.patchdir, patch))
            for string in strings:
                if ("Date:" in string
                    ):  # e.g. 'Date: Wed, 16 Jan 2013 19:09:47 +0000'
                    fields = ut.string_to_words(string[6:].lstrip(' \t'))
                    _, s_day, s_mon, s_year, s_hms, _ = fields
                    s_hour, s_minute, s_second = s_hms.split(':')
                    day, year = int(s_day), int(s_year)
                    hour, minute, second = int(s_hour), int(s_minute), int(
                        s_second)
                    month = self.month_numbers[s_mon]
                    # ignoring microseconds
                    dt = datetime(year, month, day, hour, minute, second)
                    records += [(dt, patch)]
                    break

        records = sorted(records, key=lambda r: r[0])

        patches = [patch for (_, patch) in records]

        return patches
예제 #5
0
def _iterate():

    r = c['sourcedir']
    t = ut.join_path(c['tempdir'], 'encoding.dat')
    w = h.read('walk.txt')
    for file_ in w:
        path = ut.join_path(r, file_)
        s = ut.read_strings(path)
        ut.write_strings(s, t)
예제 #6
0
def _iterate():

    r = c['sourcedir']
    t = ut.join_path(c['tempdir'], 'encoding.dat')
    w = h.read('walk.txt')
    for file_ in w:
        path = ut.join_path(r, file_)
        s = ut.read_strings(path)
        ut.write_strings(s, t)
예제 #7
0
 def read(self, filepath):
     """ Read data from path as a sequence of '\\n' terminated lines.
         Convert the lines to a list of strings
         
         Args:
             filepath (string): file path
         
         Notes:
             This function is used to input data output by the Checker, etc.
     """
     return ut.read_strings(filepath)
예제 #8
0
 def read(self, filepath):
     """ Read data from path as a sequence of '\\n' terminated lines.
         Convert the lines to a list of strings
         
         Args:
             filepath (string): file path
         
         Notes:
             This function is used to input data output by the Checker, etc.
     """
     return ut.read_strings(filepath)
예제 #9
0
 def _segments(self):
     ''' Use generator to split the archive file into diff segments
     '''
     index = begin = 0
     curr_seg = []
     for string in ut.read_strings(self._path):
         if (string.startswith('diff ')):
             if (len(curr_seg) > 0):
                 yield (begin, curr_seg)
             begin = index
             curr_seg = [string]
         else:
             curr_seg += [string]
         index += 1
예제 #10
0
def convert_api_data(config):

    srcroot = config['srcroot']
    sources = config['sources']
    data = []
    for source in sources:
        print('extract: ' + source)
        path = ut.join_path(srcroot, source)
        strings  = Strings(ut.read_strings(path))
        sections = strings.extract('#++','#--')
        if (len(sections) > 0):
            sections = [conv_section(section) for section in sections]
            data += Strings.join(sections)
        else:
            pass
    
    ut.write_strings(data, './_rest/api.txt')
예제 #11
0
 def _match_patterns(self, path):
     ''' Search files in self.paths for match to self.matcher. 
     '''
     filepath = ut.join_path(self.root_path, path)
     strings = ut.read_strings(filepath)
     for index in range(len(strings)):
         text = strings[index]
         if (self.debug > 1):
             print('   "%s"' % text)
         pattern = self.matcher(text)
         if (pattern is not None):
             if (self.trim_paths):
                 path_ = path
             else:
                 path_ = filepath
             if (pattern not in self.matches):
                 self.matches[pattern] = []
             self.matches[pattern] += [(path_, index + 1, text.lstrip())]
예제 #12
0
 def _match_patterns(self, path):
     ''' Search files in self.paths for match to self.matcher. 
     '''
     filepath = ut.join_path(self.root_path, path)
     strings = ut.read_strings(filepath)
     for index in range(len(strings)):
         text = strings[index]
         if (self.debug > 1):
             print('   "%s"' % text)
         pattern = self.matcher(text)
         if (pattern is not None):
             if (self.trim_paths):
                 path_ = path
             else:
                 path_ = filepath
             if (pattern not in self.matches):
                 self.matches[pattern] = []
             self.matches[pattern] += [(path_, index + 1, text.lstrip())]
예제 #13
0
    def __init__(self, path):
        """ Constructor
        
        Args:
            path (string): path to patch file
            
        Raises:
            PT_ParameterError
            PT_NotFoundError
        
        Notes:
            Commented out diff and hunk sections are omitted.
        """
        #--

        self.name = 'Patch'

        if (not ut.is_string_type(path)):
            raise PT_ParameterError(self.name, path)

        if (not ut.is_file(path)):
            raise PT_NotFoundError(self.name, path)

        strings = Strings(ut.read_strings(path))
        strings = strings.discard('"""', '"""')

        # Split any email header from the patch data
        (_, body) = strings.partition('diff -')

        if (body is None):  #all diffs commented out?
            self.diffs = []
            self.patch_type = 'text'
            self.patch_mode = 'git'
            print "body is none"
        elif (body[0].startswith('diff --git ')):
            # Split any email footer from the patch data
            (body, _) = body.rpartition('-- ')
            self._parse_body(body, 'diff --git ')
            self.patch_mode = 'git'
            print "git diff"
        else:
            self._parse_body(body, 'diff -')
            self.patch_mode = 'urn'
            print "urn"
예제 #14
0
    def _check(self, patchpath):
        
        self._misc_msg('\nPATCH: "%s"' % patchpath)   
        patchpath = ut.join_path(self.patchdir, patchpath)
        pdata = Patch(patchpath)
        if (len(pdata.diffs) == 0):
            self._info_msg('skipping empty/commented patch', 1)
            return 0
 
        if (pdata.patch_type == 'binary'):
            self._info_msg('skipping binary patch', 1)
            return -1
               
        errors = 0
        for diff in pdata.diffs:
            
            self._misc_msg('DIFF: "%s"' % diff.spec, 1)
            
            if (not self._check_paths(diff)):
                errors += 1
                continue
            
            if (diff.old_path == '/dev/null'): # Can't fail on adding lines to a new file
                continue
                   
            old_lines = ut.read_strings(ut.join_path(self.sourcedir, diff.old_path))
               
            for hunk in diff.hunks:
                self._misc_msg('HUNK: "%s"' % hunk.spec, 2)
                edits = hunk.edits
                start = hunk.old_start
                count = hunk.old_count
                tag   = 'old'    
                note = hunk.note
                if (not self._check_hunk_format(start, count, len(old_lines), tag)):
                    errors += 1
                    continue
                
                errors += self._check_hunk_edits(diff.old_path, edits, start, count, note, old_lines)
                    
        self._info_msg("%d patch errors" % errors, 1)
        
        return errors
예제 #15
0
 def _get_diffs(self, archive, filenames):
     ''' Generate list of diff sections that refer to files in filenames
     '''
     
     strings = ut.read_strings(archive)
     
     diff = []
     for index in range(len(strings)):
         string = strings[index]
         if (string.lstrip().startswith('diff --git ')):
             if (len(diff) > 0):
                 yield diff
             filename = ut.get_string_filename(string)
             if (filename in filenames):
                 diff = ["%04d: %s" % (index + 1, string)]
         elif (len(diff) > 0):
             diff += ["%04d: %s" % (index + 1, string)]
     if (len(diff) > 0):
         yield diff
예제 #16
0
    def _get_diffs(self, archive, filenames):
        ''' Generate list of diff sections that refer to files in filenames
        '''

        strings = ut.read_strings(archive)

        diff = []
        for index in range(len(strings)):
            string = strings[index]
            if (string.lstrip().startswith('diff --git ')):
                if (len(diff) > 0):
                    yield diff
                filename = ut.get_string_filename(string)
                if (filename in filenames):
                    diff = ["%04d: %s" % (index + 1, string)]
            elif (len(diff) > 0):
                diff += ["%04d: %s" % (index + 1, string)]
        if (len(diff) > 0):
            yield diff
예제 #17
0
    def __init__(self, path):
        """ Constructor
        
        Args:
            path (string): path to patch file
            
        Raises:
            PT_ParameterError
            PT_NotFoundError
        
        Notes:
            Commented out diff and hunk sections are omitted.
        """
        #--
 
        self.name = 'Patch'
        
        if (not ut.is_string_type(path)):
            raise PT_ParameterError(self.name, path)
        
        if (not ut.is_file(path)):
            raise PT_NotFoundError(self.name, path)
        
        strings = Strings(ut.read_strings(path))
        strings = strings.discard('"""','"""')
        
        # Split any email header from the patch data
        (_, body) = strings.partition('diff -')
        
        if (body is None): #all diffs commented out?
            self.diffs = []
            self.patch_type = 'text'
            self.patch_mode = 'git'
        elif (body[0].startswith('diff --git ')):
            # Split any email footer from the patch data
            (body, _) = body.rpartition('-- ')
            self._parse_body(body, 'diff --git ')
            self.patch_mode = 'git'
        else:
            self._parse_body(body, 'diff -')
            self.patch_mode = 'urn'
예제 #18
0
    def _get_data(self):
        ''' Scan patchset to get two mappings:
                filedata maps filenames to patches
                patchdata maps patches to filenames
        ''' 

        filedata  = {}
        patchdata = {}
        for patchname in self.get_patch_names():
            filelist = []
            strings = ut.read_strings(ut.join_path(self.patchdir, patchname))
            for index in range(len(strings)):
                if (strings[index].startswith('diff --git ')):
                    filename = ut.get_string_filename(strings[index])
                    if (filename in filedata):
                        filedata[filename] += [(patchname, index)]
                    else:
                        filedata[filename] = [(patchname, index)]
                    filelist += [(filename, index)]
            patchdata[patchname] = filelist
                        
        self.filedata  = filedata                
        self.patchdata = patchdata
예제 #19
0
    def _get_data(self):
        ''' Scan patchset to get two mappings:
                filedata maps filenames to patches
                patchdata maps patches to filenames
        '''

        filedata = {}
        patchdata = {}
        for patchname in self.get_patch_names():
            filelist = []
            strings = ut.read_strings(ut.join_path(self.patchdir, patchname))
            for index in range(len(strings)):
                if (strings[index].startswith('diff --git ')):
                    filename = ut.get_string_filename(strings[index])
                    if (filename in filedata):
                        filedata[filename] += [(patchname, index)]
                    else:
                        filedata[filename] = [(patchname, index)]
                    filelist += [(filename, index)]
            patchdata[patchname] = filelist

        self.filedata = filedata
        self.patchdata = patchdata
예제 #20
0
    def _check(self, patchpath):

        self._misc_msg('\nPATCH: "%s"' % patchpath)
        patchpath = ut.join_path(self.patchdir, patchpath)
        #         print patchpath
        pdata = Patch(patchpath)
        if (len(pdata.diffs) == 0):
            self._info_msg('skipping empty/commented patch', 1)
            return 0

        if (pdata.patch_type == 'binary'):
            self._info_msg('skipping binary patch', 1)
            return -1

        errors = 0
        context = []
        logs = ""

        for diff in pdata.diffs:

            #             print "a path :" + diff.a_path
            #             print "old path :" + diff.old_path
            #             print "new path :" + diff.new_path
            self._misc_msg('DIFF: "%s"' % diff.spec, 1)

            if (not self._check_paths(diff)):
                errors += 1
                continue

            if (diff.old_path == '/dev/null'
                ):  # Can't fail on adding lines to a new file
                continue

#             print "old file path :" + ut.join_path(self.sourcedir, diff.old_path)
            old_lines = ut.read_strings(
                ut.join_path(self.sourcedir, diff.old_path))

            new_hunks = []
            new_diff = []

            for hunk in diff.hunks:
                self._misc_msg('HUNK: "%s"' % hunk.spec, 2)
                edits = hunk.edits
                start = hunk.old_start
                count = hunk.old_count
                tag = 'old'
                note = hunk.note
                if (not self._check_hunk_format(start, count, len(old_lines),
                                                tag)):
                    errors += 1
                    continue
#                 print "begin to change hunk edits"
#                 errors += self._check_hunk_edits(diff.old_path, edits, start, count, note, old_lines)
#获取并加入新的hunk信息
                new_hunks.append(
                    self._patch_hunk_edits(diff.old_path, edits, start, count,
                                           note, old_lines))
#                 print "end for this hunk"
#写入当前hunk
            new_diff.append(diff.spec + "\n")
            #             for (new_edits,new_start,context_start,new_count,context_count) in new_hunks:
            #                 new_diff.append("@@ " + str(new_start) + "," + str(context_count) + " " + str(context_start)  + "," + str(new_count) + "@@\n")
            #                 for edit in new_edits:
            #                     new_diff.append(edit + "\n")
            #
            #             context.append("".join(new_diff))
            for (new_place, before_start, before_count, after_start,
                 after_count, log) in new_hunks:
                new_diff.append("@@ -" + str(before_start) + "," +
                                str(before_count) + " +" + str(after_start) +
                                "," + str(after_count) + "@@\n")
                for (edit, new_line_current, new_line_edited) in new_place:
                    new_diff.append(edit + "\n")
                logs += log
            context.append("".join(new_diff))
#             print new_diff
#将新的diffs信息写入文件
        f = file("new.patch", "w")
        #         print context
        f.write("".join(context))
        f.close()

        logfile = file("log.txt", "w")

        logfile.write("".join(logs))
        logfile.close()

        self._info_msg("%d patch errors" % errors, 1)

        return errors