def get_change(self, revision): """Get an individual change. This returns a Commit object containing the details of the commit. """ revision = int(revision) commits = self.client.get_log('/', start=revision, limit=2) commit = commits[0] message = commit.get('message', b'').decode('utf-8', 'replace') author_name = commit.get('author', b'').decode('utf-8', 'replace') date = commit['date'].isoformat() if len(commits) > 1: base_revision = commits[1]['revision'] else: base_revision = 0 try: enc, diff = convert_to_unicode( self.client.diff(base_revision, revision), self.repository.get_encoding_list()) except Exception as e: raise self.normalize_error(e) commit = Commit(author_name, six.text_type(revision), date, message, six.text_type(base_revision)) commit.diff = diff return commit
def get_change(self, revision): """Get an individual change. This returns a Commit object containing the details of the commit. """ revision = int(revision) commits = self.client.get_log('/', start=revision, limit=2) commit = commits[0] message = commit.get('message', b'').decode('utf-8', 'replace') author_name = commit.get('author', b'').decode('utf-8', 'replace') date = commit['date'].isoformat() if len(commits) > 1: base_revision = commits[1]['revision'] else: base_revision = 0 try: enc, diff = convert_to_unicode( self.client.diff(base_revision, revision), self.repository.get_encoding_list()) except Exception as e: raise self.normalize_error(e) commit = Commit(author_name, six.text_type(revision), date, message, six.text_type(base_revision)) commit.diff = diff return commit
def get_change(self, revision, cache_key): """Get an individual change. This returns a tuple with the commit message and the diff contents. """ revision = int(revision) commit = cache.get(cache_key) if commit: message = commit.message author_name = commit.author_name date = commit.date base_revision = commit.parent else: commits = list(self.ra.iter_log(None, revision, 0, limit=2)) rev, props = commits[0][1:3] message = props[SVN_LOG] author_name = props[SVN_AUTHOR] date = props[SVN_DATE] if len(commits) > 1: base_revision = commits[1][1] else: base_revision = 0 out, err = self.client.diff(base_revision, revision, self.repopath, self.repopath, diffopts=DIFF_UNIFIED) commit = Commit(author_name, six.text_type(revision), date, message, six.text_type(base_revision)) commit.diff = out.read() return commit
def get_change(self, revision, cache_key): """Get an individual change. This returns a tuple with the commit message and the diff contents. """ revision = int(revision) commit = cache.get(cache_key) if commit: message = commit.message author_name = commit.author_name date = commit.date base_revision = commit.parent else: commits = list(self.ra.iter_log(None, revision, 0, limit=2)) rev, props = commits[0][1:3] message = props[SVN_LOG] author_name = props[SVN_AUTHOR] date = props[SVN_DATE] if len(commits) > 1: base_revision = commits[1][1] else: base_revision = 0 out, err = self.client.diff(base_revision, revision, self.repopath, self.repopath, diffopts=DIFF_UNIFIED) commit = Commit(author_name, six.text_type(revision), date, message, six.text_type(base_revision)) commit.diff = out.read() return commit
def get_change(repository, commit_to_get): commit = Commit( message='* This is a summary\n\n* This is a description.') diff_filename = os.path.join(self.testdata_dir, 'git_readme.diff') with open(diff_filename, 'r') as f: commit.diff = f.read() return commit
def get_change(repository, commit_to_get): commit = Commit( message='* This is a summary\n\n* This is a description.') diff_filename = os.path.join(self.testdata_dir, 'git_readme.diff') with open(diff_filename, 'r') as f: commit.diff = f.read() return commit
def get_change(repository, commit_to_get): self.assertEqual(commit_id, commit_to_get) commit = Commit(message='This is my commit message\n\n' 'With a summary line too.') diff_filename = os.path.join(self.testdata_dir, 'git_readme.diff') with open(diff_filename, 'r') as f: commit.diff = f.read() return commit
def get_change(repository, commit_to_get): self.assertEqual(commit_id, commit_to_get) commit = Commit(message='This is my commit message\n\n' 'With a summary line too.') diff_filename = os.path.join(self.testdata_dir, 'git_readme.diff') with open(diff_filename, 'r') as f: commit.diff = f.read() return commit
def get_change(self, revision): """Get an individual change. This returns a tuple with the commit message and the diff contents. """ cache_key = self.repository.get_commit_cache_key(revision) revision = int(revision) head_revision = Revision(opt_revision_kind.number, revision) commit = cache.get(cache_key) if commit: message = commit.message author_name = commit.author_name date = commit.date base_revision = Revision(opt_revision_kind.number, commit.parent) else: commits = self.client.log( self.repopath, revision_start=head_revision, limit=2) commit = commits[0] message = commit['message'] author_name = commit['author'] date = datetime.datetime.utcfromtimestamp(commit['date']).\ isoformat() try: commit = commits[1] base_revision = commit['revision'] except IndexError: base_revision = Revision(opt_revision_kind.number, 0) tmpdir = mkdtemp(prefix='reviewboard-svn.') diff = self.client.diff( tmpdir, self.repopath, revision1=base_revision, revision2=head_revision, diff_options=['-u']) rmtree(tmpdir) commit = Commit(author_name, six.text_type(head_revision.number), date, message, six.text_type(base_revision.number)) commit.diff = diff return commit
def get_change(self, revision, cache_key): """Get an individual change. This returns a tuple with the commit message and the diff contents. """ revision = int(revision) head_revision = Revision(opt_revision_kind.number, revision) commit = cache.get(cache_key) if commit: message = commit.message author_name = commit.author_name date = commit.date base_revision = Revision(opt_revision_kind.number, commit.parent) else: commits = self.client.log( self.repopath, revision_start=head_revision, limit=2) commit = commits[0] message = commit['message'].decode('utf-8', 'replace') author_name = commit['author'].decode('utf-8', 'replace') date = datetime.utcfromtimestamp(commit['date']).\ isoformat() try: commit = commits[1] base_revision = commit['revision'] except IndexError: base_revision = Revision(opt_revision_kind.number, 0) tmpdir = mkdtemp(prefix='reviewboard-svn.') diff = self.client.diff( tmpdir, self.repopath, revision1=base_revision, revision2=head_revision, header_encoding='utf-8', diff_options=['-u']).decode('utf-8') rmtree(tmpdir) commit = Commit(author_name, six.text_type(head_revision.number), date, message, six.text_type(base_revision.number)) commit.diff = diff return commit
def get_change(self, repository, revision): repo_api_url = self._get_repo_api_url(repository) # Step 1: fetch the commit itself that we want to review, to get # the parent SHA and the commit message. Hopefully this information # is still in cache so we don't have to fetch it again. commit = cache.get(repository.get_commit_cache_key(revision)) if commit: author_name = commit.author_name date = commit.date parent_revision = commit.parent message = commit.message else: url = self._build_api_url(repo_api_url, "commits") url += "&sha=%s" % revision commit = self._api_get(url)[0] author_name = commit["commit"]["author"]["name"] date = (commit["commit"]["committer"]["date"],) parent_revision = commit["parents"][0]["sha"] message = commit["commit"]["message"] # Step 2: fetch the "compare two commits" API to get the diff. url = self._build_api_url(repo_api_url, "compare/%s...%s" % (parent_revision, revision)) comparison = self._api_get(url) tree_sha = comparison["base_commit"]["commit"]["tree"]["sha"] files = comparison["files"] # Step 3: fetch the tree for the original commit, so that we can get # full blob SHAs for each of the files in the diff. url = self._build_api_url(repo_api_url, "git/trees/%s" % tree_sha) url += "&recursive=1" tree = self._api_get(url) file_shas = {} for file in tree["tree"]: file_shas[file["path"]] = file["sha"] diff = [] for file in files: filename = file["filename"] status = file["status"] patch = file["patch"] diff.append("diff --git a/%s b/%s" % (filename, filename)) if status == "modified": old_sha = file_shas[filename] new_sha = file["sha"] diff.append("index %s..%s 100644" % (old_sha, new_sha)) diff.append("--- a/%s" % filename) diff.append("+++ b/%s" % filename) elif status == "added": new_sha = file["sha"] diff.append("new file mode 100644") diff.append("index %s..%s" % ("0" * 40, new_sha)) diff.append("--- /dev/null") diff.append("+++ b/%s" % filename) elif status == "removed": old_sha = file_shas[filename] diff.append("deleted file mode 100644") diff.append("index %s..%s" % (old_sha, "0" * 40)) diff.append("--- a/%s" % filename) diff.append("+++ /dev/null") diff.append(patch) diff = "\n".join(diff) # Make sure there's a trailing newline if not diff.endswith("\n"): diff += "\n" commit = Commit(author_name, revision, date, message, parent_revision) commit.diff = diff return commit
def get_change(self, repository, revision): # Step 1: fetch the commit itself that we want to review, to get # the parent SHA and the commit message. Hopefully this information # is still in cache so we don't have to fetch it again. commit = cache.get(repository.get_commit_cache_key(revision)) if commit: author_name = commit.author_name date = commit.date parent_revision = commit.parent message = commit.message else: url = self._build_api_url(repository, 'commits') url += '&sha=%s' % revision commit = self._api_get(url)[0] author_name = commit['commit']['author']['name'] date = commit['commit']['committer']['date'], parent_revision = commit['parents'][0]['sha'] message = commit['commit']['message'] # Step 2: fetch the "compare two commits" API to get the diff. url = self._build_api_url( repository, 'compare/%s...%s' % (parent_revision, revision)) comparison = self._api_get(url) tree_sha = comparison['base_commit']['commit']['tree']['sha'] files = comparison['files'] # Step 3: fetch the tree for the original commit, so that we can get # full blob SHAs for each of the files in the diff. url = self._build_api_url(repository, 'git/trees/%s' % tree_sha) url += '&recursive=1' tree = self._api_get(url) file_shas = {} for file in tree['tree']: file_shas[file['path']] = file['sha'] diff = [] for file in files: filename = file['filename'] status = file['status'] patch = file['patch'] diff.append('diff --git a/%s b/%s' % (filename, filename)) if status == 'modified': old_sha = file_shas[filename] new_sha = file['sha'] diff.append('index %s..%s 100644' % (old_sha, new_sha)) diff.append('--- a/%s' % filename) diff.append('+++ b/%s' % filename) elif status == 'added': new_sha = file['sha'] diff.append('new file mode 100644') diff.append('index %s..%s' % ('0' * 40, new_sha)) diff.append('--- /dev/null') diff.append('+++ b/%s' % filename) elif status == 'removed': old_sha = file_shas[filename] diff.append('deleted file mode 100644') diff.append('index %s..%s' % (old_sha, '0' * 40)) diff.append('--- a/%s' % filename) diff.append('+++ /dev/null') diff.append(patch) diff = '\n'.join(diff) # Make sure there's a trailing newline if not diff.endswith('\n'): diff += '\n' commit = Commit(author_name, revision, date, message, parent_revision) commit.diff = diff return commit
def get_change(self, repository, revision): # Step 1: fetch the commit itself that we want to review, to get # the parent SHA and the commit message. Hopefully this information # is still in cache so we don't have to fetch it again. commit = cache.get(repository.get_commit_cache_key(revision)) if commit: author_name = commit.author_name date = commit.date parent_revision = commit.parent message = commit.message else: url = self._build_api_url(repository, 'commits') url += '&sha=%s' % revision commit = self._api_get(url)[0] author_name = commit['commit']['author']['name'] date = commit['commit']['committer']['date'], parent_revision = commit['parents'][0]['sha'] message = commit['commit']['message'] # Step 2: fetch the "compare two commits" API to get the diff. url = self._build_api_url( repository, 'compare/%s...%s' % (parent_revision, revision)) comparison = self._api_get(url) tree_sha = comparison['base_commit']['commit']['tree']['sha'] files = comparison['files'] # Step 3: fetch the tree for the original commit, so that we can get # full blob SHAs for each of the files in the diff. url = self._build_api_url(repository, 'git/trees/%s' % tree_sha) url += '&recursive=1' tree = self._api_get(url) file_shas = {} for file in tree['tree']: file_shas[file['path']] = file['sha'] diff = [] for file in files: filename = file['filename'] status = file['status'] patch = file['patch'] diff.append('diff --git a/%s b/%s' % (filename, filename)) if status == 'modified': old_sha = file_shas[filename] new_sha = file['sha'] diff.append('index %s..%s 100644' % (old_sha, new_sha)) diff.append('--- a/%s' % filename) diff.append('+++ b/%s' % filename) elif status == 'added': new_sha = file['sha'] diff.append('new file mode 100644') diff.append('index %s..%s' % ('0' * 40, new_sha)) diff.append('--- /dev/null') diff.append('+++ b/%s' % filename) elif status == 'removed': old_sha = file_shas[filename] diff.append('deleted file mode 100644') diff.append('index %s..%s' % (old_sha, '0' * 40)) diff.append('--- a/%s' % filename) diff.append('+++ /dev/null') diff.append(patch) diff = '\n'.join(diff) # Make sure there's a trailing newline if not diff.endswith('\n'): diff += '\n' commit = Commit(author_name, revision, date, message, parent_revision) commit.diff = diff return commit