def _get_fake_changeset(scmtool, commit_id, allow_empty=True): self.assertEqual(commit_id, current_commit_id) changeset = ChangeSet() changeset.pending = False changeset.changenum = int(new_commit_id) return changeset
def parse_change_desc(changedesc, changenum, allow_empty=False): if not changedesc: return None changeset = ChangeSet() try: changeset.changenum = int(changedesc['change']) except ValueError: changeset.changenum = changenum # At it's most basic, a perforce changeset description has three # sections. # # --------------------------------------------------------- # Change <num> by <user>@<client> on <timestamp> *pending* # # description... # this can be any number of lines # # Affected files ... # # //depot/branch/etc/file.cc#<revision> branch # //depot/branch/etc/file.hh#<revision> delete # --------------------------------------------------------- # # At the moment, we only care about the description and the list of # files. We take the first line of the description as the summary. # # We parse the username out of the first line to check that one user # isn't attempting to "claim" another's changelist. We then split # everything around the 'Affected files ...' line, and process the # results. changeset.username = changedesc['user'] try: changeset.description = changedesc['desc'].decode('utf-8') except UnicodeDecodeError: changeset.description = changedesc['desc'].decode('utf-8', 'replace') if changedesc['status'] == "pending": changeset.pending = True try: changeset.files = changedesc['depotFile'] except KeyError: if not allow_empty: raise EmptyChangeSetError(changenum) split = changeset.description.find('\n\n') if split >= 0 and split < 100: changeset.summary = \ changeset.description.split('\n\n', 1)[0].replace('\n', ' ') else: changeset.summary = changeset.description.split('\n', 1)[0] return changeset
def parse_change_desc(changedesc, changenum, allow_empty=False): if not changedesc: return None changeset = ChangeSet() changeset.changenum = changenum # At it's most basic, a perforce changeset description has three # sections. # # --------------------------------------------------------- # Change <num> by <user>@<client> on <timestamp> *pending* # # description... # this can be any number of lines # # Affected files ... # # //depot/branch/etc/file.cc#<revision> branch # //depot/branch/etc/file.hh#<revision> delete # --------------------------------------------------------- # # At the moment, we only care about the description and the list of # files. We take the first line of the description as the summary. # # We parse the username out of the first line to check that one user # isn't attempting to "claim" another's changelist. We then split # everything around the 'Affected files ...' line, and process the # results. changeset.username = changedesc['user'] try: changeset.description = changedesc['desc'].decode('utf-8') except UnicodeDecodeError: changeset.description = changedesc['desc'].decode( 'utf-8', 'replace') if changedesc['status'] == "pending": changeset.pending = True try: changeset.files = changedesc['depotFile'] except KeyError: if not allow_empty: raise EmptyChangeSetError(changenum) split = changeset.description.find('\n\n') if split >= 0 and split < 100: changeset.summary = \ changeset.description.split('\n\n', 1)[0].replace('\n', ' ') else: changeset.summary = changeset.description.split('\n', 1)[0] return changeset
def get_changeset(self, changesetid): logging.debug('Plastic: get_changeset %s' % (changesetid)) changesetdata = self.client.get_changeset(changesetid) logging.debug('Plastic: changesetdata %s' % (changesetdata)) # Changeset data is in the form of multiple lines of: # <changesetid> <user> <revid> <file spec> # # We assume the user and comment will be the same for each item, so # read it out of the first. # changeset = ChangeSet() changeset.changenum = changesetid split = changesetdata.split('\n') m = self.CS_RE.match(split[0]) revid = m.group("revid") changeset.username = m.group("user") changeset.summary = self.client.get_changeset_comment( changesetid, revid) logging.debug('Plastic: changeset user %s summary %s' % (changeset.username, changeset.summary)) for line in split: if line: m = self.CS_RE.match(line) if not m: logging.debug('Plastic: bad re %s failed to match %s' % (self.CS_RE, line)) raise SCMError("Error looking up changeset") if m.group("csid") != str(changesetid): logging.debug('Plastic: csid %s != %s' % (m.group("csid"), changesetid)) raise SCMError( "The server returned a changeset ID that was not requested" ) logging.debug('Plastic: adding file %s' % (m.group("file"))) changeset.files += m.group("file") return changeset
def test_empty_changeset(self): """Testing ChangeSet defaults""" cs = ChangeSet() self.assertEqual(cs.changenum, None) self.assertEqual(cs.summary, '') self.assertEqual(cs.description, '') self.assertEqual(cs.branch, '') self.assertTrue(len(cs.bugs_closed) == 0) self.assertTrue(len(cs.files) == 0)
def get_changeset(self, changesetid, allow_empty=False): logging.debug('Plastic: get_changeset %s' % (changesetid)) changesetdata = self.client.get_changeset(changesetid) logging.debug('Plastic: changesetdata %s' % (changesetdata)) # Changeset data is in the form of multiple lines of: # <changesetid> <user> <revid> <file spec> # # We assume the user and comment will be the same for each item, so # read it out of the first. # changeset = ChangeSet() changeset.changenum = changesetid split = changesetdata.split('\n') m = self.CS_RE.match(split[0]) revid = m.group("revid") changeset.username = m.group("user") changeset.summary = self.client.get_changeset_comment(changesetid, revid) logging.debug('Plastic: changeset user %s summary %s' % (changeset.username, changeset.summary)) for line in split: if line: m = self.CS_RE.match(line) if not m: logging.debug('Plastic: bad re %s failed to match %s' % (self.CS_RE, line)) raise SCMError("Error looking up changeset") if m.group("csid") != six.text_type(changesetid): logging.debug('Plastic: csid %s != %s' % (m.group("csid"), changesetid)) raise SCMError('The server returned a changeset ID that ' 'was not requested') logging.debug('Plastic: adding file %s' % (m.group("file"))) changeset.files += m.group("file") return changeset
def get_changeset(self, changesetid, allow_empty=False): changeset = ChangeSet() changeset.changenum = changesetid changeset.description = 'Hello world!' changeset.pending = True if not allow_empty: changeset.files = ['README.md'] changeset.summary = 'Added a README markdown to help explain what the'\ ' repository is used for. Hopefully, this takes off.' changeset.testing_done = "None was performed" return changeset
def testInterface(self): """Testing basic scmtools.core API""" # Empty changeset cs = ChangeSet() self.assertEqual(cs.changenum, None) self.assertEqual(cs.summary, '') self.assertEqual(cs.description, '') self.assertEqual(cs.branch, '') self.assert_(len(cs.bugs_closed) == 0) self.assert_(len(cs.files) == 0)
def test_update_from_pending_change_with_rich_text_reset(self): """Testing ReviewRequestDraft.update_from_pending_change resets rich text fields """ review_request = ReviewRequest.objects.create(self.user, self.repository) draft = ReviewRequestDraft.create(review_request) draft.description_rich_text = True draft.testing_done_rich_text = True changeset = ChangeSet() changeset.changenum = 4 changeset.summary = '* This is a summary' changeset.description = '* This is a description.' changeset.testing_done = '* This is some testing.' draft.update_from_pending_change(4, changeset) self.assertEqual(draft.summary, '* This is a summary') self.assertEqual(draft.description, '* This is a description.') self.assertFalse(draft.description_rich_text) self.assertEqual(draft.testing_done, '* This is some testing.') self.assertFalse(draft.testing_done_rich_text)
def test_update_from_pending_change_with_rich_text_reset(self): """Testing ReviewRequest.update_from_pending_change resets rich text fields""" review_request = ReviewRequest.objects.create(self.user, self.repository) review_request.description_rich_text = True review_request.testing_done_rich_text = True changeset = ChangeSet() changeset.changenum = 4 changeset.summary = '* This is a summary' changeset.description = '* This is a description.' changeset.testing_done = '* This is some testing.' review_request.update_from_pending_change(4, changeset) self.assertEqual(review_request.summary, '* This is a summary') self.assertEqual(review_request.description, '* This is a description.') self.assertFalse(review_request.description_rich_text) self.assertEqual(review_request.testing_done, '* This is some testing.') self.assertFalse(review_request.testing_done_rich_text)
def _parse_change_desc(self, changedesc, changenum, allow_empty=False): """Parse the contents of a change description from Perforce. This will attempt to grab details from the change description, including the changeset ID, the list of files, change message, and state. Args: changedesc (dict): The change description dictionary from Perforce. changenum (int): THe change number. allow_empty (bool, optional): Whether an empty changeset (containing no files) is allowed. Returns: reviewboard.scmtools.core.ChangeSet: The resulting changeset, or ``None`` if ``changedesc`` is empty. Raises: reviewboard.scmtools.errors.EmptyChangeSetError: The resulting changeset contained no file modifications (and ``allow_empty`` was ``False``). """ if not changedesc: return None changeset = ChangeSet() try: changeset.changenum = int(changedesc['change']) except ValueError: changeset.changenum = changenum # At it's most basic, a perforce changeset description has three # sections. # # --------------------------------------------------------- # Change <num> by <user>@<client> on <timestamp> *pending* # # description... # this can be any number of lines # # Affected files ... # # //depot/branch/etc/file.cc#<revision> branch # //depot/branch/etc/file.hh#<revision> delete # --------------------------------------------------------- # # At the moment, we only care about the description and the list of # files. We take the first line of the description as the summary. # # We parse the username out of the first line to check that one user # isn't attempting to "claim" another's changelist. We then split # everything around the 'Affected files ...' line, and process the # results. changeset.username = force_text(changedesc['user']) changeset.description = force_text(changedesc['desc'], errors='replace') if changedesc['status'] == 'pending': changeset.pending = True try: changeset.files = [ force_text(depot_file) for depot_file in changedesc['depotFile'] ] except KeyError: if not allow_empty: raise EmptyChangeSetError(changenum) split = changeset.description.find('\n\n') if split >= 0 and split < 100: changeset.summary = \ changeset.description.split('\n\n', 1)[0].replace('\n', ' ') else: changeset.summary = changeset.description.split('\n', 1)[0] return changeset
def _parse_change_desc(self, changedesc, changenum, allow_empty=False): """Parse the contents of a change description from Perforce. This will attempt to grab details from the change description, including the changeset ID, the list of files, change message, and state. Args: changedesc (dict): The change description dictionary from Perforce. changenum (int): THe change number. allow_empty (bool, optional): Whether an empty changeset (containing no files) is allowed. Returns: reviewboard.scmtools.core.ChangeSet: The resulting changeset, or ``None`` if ``changedesc`` is empty. Raises: reviewboard.scmtools.errors.EmptyChangeSetError: The resulting changeset contained no file modifications (and ``allow_empty`` was ``False``). """ if not changedesc: return None changeset = ChangeSet() try: changeset.changenum = int(changedesc['change']) except ValueError: changeset.changenum = changenum # At it's most basic, a perforce changeset description has three # sections. # # --------------------------------------------------------- # Change <num> by <user>@<client> on <timestamp> *pending* # # description... # this can be any number of lines # # Affected files ... # # //depot/branch/etc/file.cc#<revision> branch # //depot/branch/etc/file.hh#<revision> delete # --------------------------------------------------------- # # At the moment, we only care about the description and the list of # files. We take the first line of the description as the summary. # # We parse the username out of the first line to check that one user # isn't attempting to "claim" another's changelist. We then split # everything around the 'Affected files ...' line, and process the # results. changeset.username = changedesc['user'] try: changeset.description = changedesc['desc'].decode('utf-8') except UnicodeDecodeError: changeset.description = changedesc['desc'].decode('utf-8', 'replace') if changedesc['status'] == 'pending': changeset.pending = True try: changeset.files = changedesc['depotFile'] except KeyError: if not allow_empty: raise EmptyChangeSetError(changenum) split = changeset.description.find('\n\n') if split >= 0 and split < 100: changeset.summary = \ changeset.description.split('\n\n', 1)[0].replace('\n', ' ') else: changeset.summary = changeset.description.split('\n', 1)[0] return changeset