예제 #1
0
    def test_commits_to_file(self):
        def check_one(project, filename, expected, after=None, before=None):
            expected = [project.repo.commit(sha) for sha in expected]
            after_commit = project.repo.commit(after) if after else None
            before_commit = project.repo.commit(before) if before else None
            self.assertEqual(
                project.commits_to_file(filename,
                                        after=after_commit,
                                        before=before_commit), expected)

        project = Project.from_url('https://github.com/google/protobuf')
        check_one(project,
                  'php/composer.json',
                  ['21b0e55', 'b9b34e9', '6b27c1f', '46ae90d'],
                  before='21b0e55')

        # corner case: file is renamed once
        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project,
                  'file-one.txt', ['474ea04', '922e13d', '422cab3'],
                  before='474ea04')

        # After first commit
        check_one(project,
                  'file-one.txt', ['474ea04', '922e13d', '422cab3'],
                  after='964adc5',
                  before='474ea04')
예제 #2
0
    def test_column_project_name(self):
        def check_one(project, expected):
            name = column_project_name(project, None, "", 1)
            self.assertEqual(name, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'blameandshame-test-repo')
        project = Project.from_url('https://github.com/google/protobuf')
        check_one(project, 'protobuf')
예제 #3
0
    def test_time_between_commits(self):
        project = Project.from_url('https://github.com/google/protobuf')

        delta = Project.time_between_commits(project.repo.commit("ac5371d"),
                                             project.repo.commit("9935829"))
        self.assertEqual(delta, timedelta(seconds=10628))

        delta = Project.time_between_commits(project.repo.commit("9935829"),
                                             project.repo.commit("ac5371d"))
        self.assertEqual(delta, timedelta(seconds=10628))
예제 #4
0
def column_num_project_commits_after_modified(project: Project,
                                              commit: git.Commit,
                                              filename: str, line: int) -> str:
    """
    Reports the number of commits that have been made to a given project
    since a line was modified.
    """
    line_modified_commit = project.last_commit_to_line(filename, line, commit)
    commits = project.commits_to_repo(after=line_modified_commit,
                                      before=commit)
    return str(len(commits))
예제 #5
0
    def test_commits_to_repo(self):
        def check_one(project, expected, after=None, before=None):
            expected = [project.repo.commit(sha) for sha in expected]
            after_commit = project.repo.commit(after) if after else None
            before_commit = project.repo.commit(before) if before else None
            self.assertEqual(
                project.commits_to_repo(after=after_commit,
                                        before=before_commit), expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, ['e1d2532', '71622b3', '9ca70f7'],
                  after='2282c66',
                  before='e1d2532')

        # Starting from first commit
        check_one(project, ['922e13d', '422cab3'],
                  after='964adc5',
                  before='922e13d')

        # after == before
        check_one(project, [], after='2282c66', before='2282c66')

        # no before
        check_one(project, ['422cab3', '964adc5'], before='422cab3')
예제 #6
0
def column_num_days_since_modified(project: Project, commit: git.Commit,
                                   filename: str, line: int) -> str:
    """
    Reports the number of days that have passed, relative to a given commit,
    since a given line was last changed.
    """
    return str(project.age_of_line_td(commit, filename, line).days)
예제 #7
0
def column_file_age_commits_to_file(project: Project, commit: git.Commit,
                                    filename: str, line: int) -> str:
    """
    Returns the age of the file in commits to the file.
    """
    return str(
        project.age_commits_file(filename, Commits.TO_FILE, before=commit))
예제 #8
0
 def test_files_in_commit(self):
     project = Project.from_url('https://github.com/google/protobuf')
     self.assertEqual(
         project.files_in_commit(project.repo.commit('baed06e')),
         frozenset(['objectivec/GPBCodedOutputStream.m']))
     self.assertEqual(
         project.files_in_commit(project.repo.commit('949596e')),
         frozenset(['objectivec/GPBMessage.m']))
     self.assertEqual(
         project.files_in_commit(project.repo.commit('cd5f49d'),
                                 {Change.MODIFIED}),
         frozenset([
             'ruby/travis-test.sh', 'ruby/ext/google/protobuf_c/protobuf.c',
             'ruby/ext/google/protobuf_c/defs.c', 'ruby/Rakefile',
             'Makefile.am', '.gitignore',
             'ruby/ext/google/protobuf_c/protobuf.h'
         ]))
     self.assertEqual(
         project.files_in_commit(project.repo.commit('cd5f49d'),
                                 {Change.ADDED}),
         frozenset(['ruby/tests/gc_test.rb']))
     self.assertEqual(
         project.files_in_commit(project.repo.commit('cd5f49d')),
         frozenset([
             'ruby/travis-test.sh', 'ruby/ext/google/protobuf_c/protobuf.c',
             'ruby/ext/google/protobuf_c/defs.c', 'ruby/Rakefile',
             'Makefile.am', '.gitignore',
             'ruby/ext/google/protobuf_c/protobuf.h',
             'ruby/tests/gc_test.rb'
         ]))
예제 #9
0
    def test_url_to_path(self):
        repos_dir = os.path.join(os.getcwd(), '.repos')

        self.assertEqual(Project._url_to_path('https://github.com/uber/pyro'),
                         os.path.join(repos_dir, 'pyro'))
        self.assertEqual(
            Project._url_to_path('https://github.com/google/protobuf'),
            os.path.join(repos_dir, 'protobuf'))
        self.assertEqual(
            Project._url_to_path('https://github.com/cilium/cilium'),
            os.path.join(repos_dir, 'cilium'))
        self.assertEqual(Project._url_to_path('https://github.com/golang/dep'),
                         os.path.join(repos_dir, 'dep'))
        self.assertEqual(
            Project._url_to_path('https://github.com/opencv/opencv.git'),
            os.path.join(repos_dir, 'opencv'))
예제 #10
0
def column_last_commit(project: Project, commit: git.Commit, filename: str,
                       line: int) -> str:
    """
    Used to provide a column that reports the last commit that touched a given
    version of a file. Does not consider any changes by the provided commit.
    """
    last = project.last_commit_to_line(filename, line, commit)
    return last.hexsha[:7] if last else '-'
예제 #11
0
    def test_authors_of_line(self):
        def check_one(project, filename, line, before, expected):
            before = project.repo.commit(before)
            actors = project.authors_of_line(filename, line, before=before)
            authors = frozenset(a.name for a in actors)
            self.assertEqual(authors, frozenset(expected))

        project = Project.from_url('https://github.com/google/protobuf')
        check_one(project, 'php/composer.json', 2, '21b0e55', ['Paul Yang'])
예제 #12
0
 def test_age_of_line_td(self):
     project = Project.from_url(
         'https://github.com/squaresLab/blameandshame-test-repo')
     commit = project.repo.commit('86c9401')
     self.assertEqual(
         project.age_of_line_td(commit, 'file-one.txt', 5).seconds, 69850)
     commit = project.repo.commit('964adc5')
     self.assertEqual(
         project.age_of_line_td(commit, 'file-one.txt', 3).seconds, 0)
예제 #13
0
    def test_column_last_commit(self):
        def check_one(project, commit, filename, line, expected):
            commit = project.repo.commit(commit)
            last_commit = column_last_commit(project, commit, filename, line)
            self.assertEqual(last_commit, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'e1d2532', 'file-one.txt', 1, 'e1d2532')
예제 #14
0
    def test_column_project_age_commits(self):
        def check_one(project, commit, expected):
            commit = project.repo.commit(commit)
            self.assertEqual(
                column_project_age_commits(project, commit, "", 0), expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'a351329', '18')
        check_one(project, '71622b3', '11')
예제 #15
0
    def test_commits_to_line(self):
        def check_one(project, filename, lineno, expected):
            expected = [project.repo.commit(sha) for sha in expected]
            self.assertEqual(
                project.commits_to_line(filename, lineno, before=expected[0]),
                expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'file.txt', 1, ['922e13d', '422cab3'])
예제 #16
0
 def modified_lines(self) -> FrozenSet[Line]:
     """
     The set of lines in the buggy version of the project that were modified
     as part of the bug fix. Note that lines belonging to files that were
     deleted by the bug fix are not considered to have been modified.
     """
     files = list(self.modified_files)
     return Project.lines_modified_between_commits(before=self.before,
                                                   after=self.after,
                                                   in_files=files)
예제 #17
0
    def test_age_commits_line(self):
        def check_one(project,
                      lineno,
                      filename,
                      relative_to,
                      expected,
                      before=None,
                      after=None):
            before = project.repo.commit(before) if before else None
            after = project.repo.commit(after) if after else None
            age = project.age_commits_line(filename,
                                           lineno,
                                           relative_to=relative_to,
                                           before=before,
                                           after=after)
            self.assertEqual(age, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project,
                  5,
                  'testfile.c',
                  Commits.TO_LINE,
                  2,
                  before='ec922df',
                  after='71622b3')
        check_one(project,
                  5,
                  'testfile.c',
                  Commits.TO_FILE,
                  2,
                  before='ec922df',
                  after='71622b3')
        check_one(project,
                  5,
                  'testfile.c',
                  Commits.TO_PROJECT,
                  2,
                  before='ec922df',
                  after='71622b3')
        check_one(project,
                  4,
                  'testfile.c',
                  Commits.TO_PROJECT,
                  2,
                  before='ec922df')
        check_one(project,
                  4,
                  'testfile.c',
                  Commits.TO_LINE,
                  1,
                  before='ec922df')
        self.assertRaises(
            ValueError,
            lambda: project.age_commits_line(project, 0, '', None, 0))
예제 #18
0
def column_was_modified_by_commit(project: Project, commit: git.Commit,
                                  filename: str, line: int) -> str:
    """
    Returns the string 'Y' if the line was modified by the commit, otherwise
    returns 'N'
    """
    _, new_lines = Project.lines_modified_by_commit(commit)
    for modified_line in new_lines:
        if modified_line.filename == filename and modified_line.num == line:
            return "true"
    return "false"
예제 #19
0
    def test_column_was_modified_by_commit(self):
        def check_one(project, commit, filename, line, expected):
            commit = project.repo.commit(commit)
            modified = column_was_modified_by_commit(project, commit, filename,
                                                     line)
            self.assertEqual(modified, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'e1d2532', 'file-one.txt', 1, 'true')
        check_one(project, 'e1d2532', 'file-one.txt', 3, 'false')
예제 #20
0
    def test_column_file_age_commits_to_file(self):
        def check_one(project, commit, filename, expected):
            commit = project.repo.commit(commit)
            self.assertEqual(
                column_file_age_commits_to_file(project, commit, filename, 0),
                expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'a351329', 'testfile.c', '5')
        check_one(project, '86c9401', 'file-one.txt', '7')
예제 #21
0
    def test_column_num_days_since_modified(self):
        def check_one(project, commit, filename, line, expected):
            commit = project.repo.commit(commit)
            num_days = column_num_days_since_modified(project, commit,
                                                      filename, line)
            self.assertEqual(num_days, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'e1d2532', 'file-one.txt', 1, '0')
        check_one(project, 'e1d2532', 'file-one.txt', 3, '1')
예제 #22
0
    def test_num_lines_in_file(self):
        def check_one(project, filename, version, expected):
            version = project.repo.commit(version)
            actual = project._num_lines_in_file(filename, version)
            self.assertEqual(actual, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'file-one.txt', '86c9401', 7)
        check_one(project, 'file-one.txt', '0d841d1', 5)
        check_one(project, 'file-one.txt', '4d6c7f4', 3)
        check_one(project, 'file.txt', '422cab3', 1)
예제 #23
0
    def test_age_commits_project(self):
        def check_one(project, expected, before=None, after=None):
            before = project.repo.commit(before) if before else None
            after = project.repo.commit(after) if after else None
            age = project.age_commits_project(before=before, after=after)
            self.assertEqual(age, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 3, before='e1d2532', after='2282c66')
        check_one(project, 2, before='922e13d', after='964adc5')
        check_one(project, 0, before='2282c66', after='2282c66')
        check_one(project, 2, before='422cab3')
예제 #24
0
    def test_last_commit_to_line(self):
        def check_one(project, filename, line, before, expected):
            before = project.repo.commit(before)
            if expected is not None:
                expected = project.repo.commit(expected)
            actual = project.last_commit_to_line(filename, line, before)
            self.assertEqual(actual, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project, 'file-one.txt', 1, '9ca70f7', '922e13d')
        check_one(project, 'file-one.txt', 5, 'e1d2532', '0d841d1')
        check_one(project, 'file-one.txt', 1, '422cab3', None)
        check_one(project, 'file-one.txt', 1, 'e1d2532', 'e1d2532')
예제 #25
0
    def test_age_commits_file(self):
        def check_one(project,
                      filename,
                      relative_to,
                      expected,
                      before=None,
                      after=None):
            before = project.repo.commit(before) if before else None
            after = project.repo.commit(after) if after else None
            age = project.age_commits_file(filename=filename,
                                           relative_to=relative_to,
                                           before=before,
                                           after=after)
            self.assertEqual(age, expected)

        project = Project.from_url('https://github.com/google/protobuf')
        check_one(project,
                  'php/composer.json',
                  Commits.TO_FILE,
                  4,
                  before='21b0e55')

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(project,
                  'file-one.txt',
                  Commits.TO_FILE,
                  6,
                  before='e1d2532')
        check_one(project,
                  'file-one.txt',
                  Commits.TO_PROJECT,
                  10,
                  before='e1d2532')
        self.assertRaises(
            ValueError,
            lambda: project.age_commits_file("", relative_to=Commits.TO_LINE))
예제 #26
0
    def test_use_different_commit(self):
        def check_one(fun, project, commit, different_commit, filename, line,
                      expected):
            commit = project.repo.commit(commit)
            different_commit = project.repo.commit(different_commit)
            modified = use_different_commit(fun, different_commit)
            result = modified(project, commit, filename, line)
            self.assertEqual(result, expected)

        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        check_one(column_last_commit, project, '0d841d1', 'e1d2532',
                  'file-one.txt', 1, 'e1d2532')
        check_one(column_num_file_commits_after_modified, project, '0d841d1',
                  'e1d2532', 'file-one.txt', 2, '4')
예제 #27
0
 def test_lines_modified_by_commit(self):
     project = Project.from_url('https://github.com/google/protobuf')
     self.assertEqual(
         project.lines_modified_by_commit(project.repo.commit('baed06e')),
         (frozenset({Line('objectivec/GPBCodedOutputStream.m', 177)}),
          frozenset({Line('objectivec/GPBCodedOutputStream.m', 180)})))
     # Only add
     self.assertEqual(
         project.lines_modified_by_commit(project.repo.commit('ac5371d')),
         (frozenset(), frozenset({Line('BUILD', 27),
                                  Line('BUILD', 28)})))
     # Only delete
     self.assertEqual(
         project.lines_modified_by_commit(project.repo.commit('d680159')),
         (frozenset({Line('src/google/protobuf/stubs/time.cc', 24)
                     }), frozenset()))
예제 #28
0
    def test_annotate(self):
        project = Project.from_url(
            'https://github.com/squaresLab/blameandshame-test-repo')
        actual = \
            annotate(project, project.repo.commit("e1d2532"), "file-one.txt")
        expected = [(1, 'Hello world.'), (2, ''), (3, 'How are you? :-)'),
                    (4, ''), (5, 'Debugging time!')]
        self.assertEqual(actual, expected)

        columns = [column_last_commit]
        actual = \
            annotate(project,
                     project.repo.commit("e1d2532"),
                     "file-one.txt",
                     columns)
        expected = [(1, 'Hello world.', 'e1d2532'), (2, '', '922e13d'),
                    (3, 'How are you? :-)', '922e13d'), (4, '', '0d841d1'),
                    (5, 'Debugging time!', '0d841d1')]
        self.assertEqual(actual, expected)
예제 #29
0
 def build(repo_url: str, before_sha: str, after_sha: str) -> 'Observation':
     project = Project.from_url(repo_url)
     before = project.repo.commit(before_sha)
     after = project.repo.commit(after_sha)
     return Observation(project, before, after)
예제 #30
0
def column_project_age_commits(project: Project, commit: git.Commit,
                               filename: str, line: int) -> str:
    """
    Returns the age of the project in commits.
    """
    return str(project.age_commits_project(before=commit))