def file_change_history(self, branch='master', limit=None, days=None, ignore_globs=None, include_globs=None):
        """
        Returns a DataFrame of all file changes (via the commit history) for the specified branch.  This is similar to
        the commit history DataFrame, but is one row per file edit rather than one row per commit (which may encapsulate
        many file changes). Included in the DataFrame will be the columns:

         * date (index)
         * author
         * committer
         * message
         * filename
         * insertions
         * deletions

        :param branch: the branch to return commits for
        :param limit: (optional, default=None) a maximum number of commits to return, None for no limit
        :param days: (optional, default=None) number of days to return if limit is None
        :param ignore_globs: (optional, default=None) a list of globs to ignore, default none excludes nothing
        :param include_globs: (optinal, default=None) a list of globs to include, default of None includes everything.
        :return: DataFrame
        """

        # setup the dataset of commits
        if limit is None:
            if days is None:
                ds = [[
                          x.author.name,
                          x.committer.name,
                          x.committed_date,
                          x.message,
                          x.name_rev.split()[0],
                          self.__check_extension(x.stats.files, ignore_globs=ignore_globs, include_globs=include_globs)
                      ] for x in self.repo.iter_commits(branch, max_count=sys.maxsize)]
            else:
                ds = []
                c_date = time.time()
                commits = self.repo.iter_commits(branch, max_count=sys.maxsize)
                dlim = time.time() - days * 24 * 3600
                while c_date > dlim:
                    try:
                        if sys.version_info.major == 2:
                            x = commits.next()
                        else:
                            x = commits.__next__()
                    except StopIteration:
                        break

                    c_date = x.committed_date
                    if c_date > dlim:
                        ds.append([
                            x.author.name,
                            x.committer.name,
                            x.committed_date,
                            x.message,
                            x.name_rev.split()[0],
                            self.__check_extension(x.stats.files, ignore_globs=ignore_globs,
                                                   include_globs=include_globs)
                        ])

        else:
            ds = [[
                      x.author.name,
                      x.committer.name,
                      x.committed_date,
                      x.message,
                      x.name_rev.split()[0],
                      self.__check_extension(x.stats.files, ignore_globs=ignore_globs, include_globs=include_globs)
                  ] for x in self.repo.iter_commits(branch, max_count=limit)]

        ds = [x[:-1] + [fn, x[-1][fn]['insertions'], x[-1][fn]['deletions']] for x in ds for fn in x[-1].keys() if
              len(x[-1].keys()) > 0]

        # make it a pandas dataframe
        df = DataFrame(ds,
                       columns=['author', 'committer', 'date', 'message', 'rev', 'filename', 'insertions', 'deletions'])

        # format the date col and make it the index
        df['date'] = to_datetime(df['date'].map(datetime.datetime.fromtimestamp))
        df.set_index(keys=['date'], drop=True, inplace=True)

        return df
def file_change_history ( self , branch = 'master' , limit = None , days = None , ignore_globs = None , include_globs = None ) : if limit is None : if days is None : ds = [ [ x . author . name , x . committer . name , x . committed_date , x . message , x . name_rev . split ( ) [ 0 ] , self . __check_extension ( x . stats . files , ignore_globs = ignore_globs , include_globs = include_globs ) ] for x in self . repo . iter_commits ( branch , max_count = sys . maxsize ) ] else : ds = [ ] c_date = time . time ( ) commits = self . repo . iter_commits ( branch , max_count = sys . maxsize ) dlim = time . time ( ) - days * 24 * 3600 while c_date > dlim : try : if sys . version_info . major == 2 : x = commits . next ( ) else : x = commits . __next__ ( ) except StopIteration : break c_date = x . committed_date if c_date > dlim : ds . append ( [ x . author . name , x . committer . name , x . committed_date , x . message , x . name_rev . split ( ) [ 0 ] , self . __check_extension ( x . stats . files , ignore_globs = ignore_globs , include_globs = include_globs ) ] ) else : ds = [ [ x . author . name , x . committer . name , x . committed_date , x . message , x . name_rev . split ( ) [ 0 ] , self . __check_extension ( x . stats . files , ignore_globs = ignore_globs , include_globs = include_globs ) ] for x in self . repo . iter_commits ( branch , max_count = limit ) ] ds = [ x [ : - 1 ] + [ fn , x [ - 1 ] [ fn ] [ 'insertions' ] , x [ - 1 ] [ fn ] [ 'deletions' ] ] for x in ds for fn in x [ - 1 ] . keys ( ) if len ( x [ - 1 ] . keys ( ) ) > 0 ] df = DataFrame ( ds , columns = [ 'author' , 'committer' , 'date' , 'message' , 'rev' , 'filename' , 'insertions' , 'deletions' ] ) df [ 'date' ] = to_datetime ( df [ 'date' ] . map ( datetime . datetime . fromtimestamp ) ) df . set_index ( keys = [ 'date' ] , drop = True , inplace = True ) return df
Returns a DataFrame of all file changes (via the commit history) for the specified branch.  This is similar to
        the commit history DataFrame, but is one row per file edit rather than one row per commit (which may encapsulate
        many file changes). Included in the DataFrame will be the columns:

         * date (index)
         * author
         * committer
         * message
         * filename
         * insertions
         * deletions

        :param branch: the branch to return commits for
        :param limit: (optional, default=None) a maximum number of commits to return, None for no limit
        :param days: (optional, default=None) number of days to return if limit is None
        :param ignore_globs: (optional, default=None) a list of globs to ignore, default none excludes nothing
        :param include_globs: (optinal, default=None) a list of globs to include, default of None includes everything.
        :return: DataFrame