def _convert_to_bisect_arg(self, value): """ Transform a string value to a date or datetime if it looks like it. """ try: value = parse_date(value) except DateFormatError: try: repo = self.options.repo if (get_name(repo) == 'mozilla-release' or (not repo and re.match(r'^\d+\.\d\.\d$', value))): new_value = tag_of_release(value) if not repo: self.logger.info("Assuming repo mozilla-release") self.fetch_config.set_repo('mozilla-release') self.logger.info("Using tag %s for release %s" % (new_value, value)) value = new_value elif (get_name(repo) == 'mozilla-beta' or (not repo and re.match(r'^\d+\.0b\d+$', value))): new_value = tag_of_beta(value) if not repo: self.logger.info("Assuming repo mozilla-beta") self.fetch_config.set_repo('mozilla-beta') self.logger.info("Using tag %s for release %s" % (new_value, value)) value = new_value else: new_value = parse_date(date_of_release(value)) self.logger.info("Using date %s for release %s" % (new_value, value)) value = new_value except UnavailableRelease: self.logger.info("%s is not a release, assuming it's a hash..." % value) return value
def set_repo(self, repo): """ Allow to define the repo name. If not set or set to None, default repos would be used (see :meth:`get_nightly_repo` and :attr:`inbound_branch`) """ self.repo = branches.get_name(repo) if repo else None
def handle_merge(self): # let's check if we are facing a merge, and in that case, # continue the bisection from the merged branch. result = None LOG.debug("Starting merge handling...") # we have to check the commit of the most recent push most_recent_push = self.build_range[1] jp = JsonPushes(most_recent_push.repo_name) push = jp.push(most_recent_push.changeset, full='1') msg = push.changeset['desc'] LOG.debug("Found commit message:\n%s\n" % msg) branch = find_branch_in_merge_commit(msg, most_recent_push.repo_name) if not (branch and len(push.changesets) >= 2): # We did not find a branch, lets check the integration branches if we are bisecting m-c LOG.debug( "Did not find a branch, checking all integration branches") if get_name(most_recent_push.repo_name) == 'mozilla-central' and \ len(push.changesets) >= 2: branch = self._choose_integration_branch( most_recent_push.changeset) jp2 = JsonPushes(branch) try: data = jp2.pushes_within_changes( push.changesets[0]['node'], push.changesets[-1]['node']) except MozRegressionError, exc: LOG.error( "Failed to find changes in branch '%s' (error: %s)" % (branch, exc)) raise LOG.info("************* Switching to %s by" " process of elimination (no branch detected in" " commit message)" % branch) gr, br = self._reverse_if_find_fix(data[0].changeset, data[-1].changeset) return (branch, gr, br) else: return
def test_branch_name(branch, alias): assert branch == branches.get_name(alias)
def handle_merge(self): # let's check if we are facing a merge, and in that case, # continue the bisection from the merged branch. result = None LOG.debug("Starting merge handling...") # we have to check the commit of the most recent push most_recent_push = self.build_range[1] jp = JsonPushes(most_recent_push.repo_name) push = jp.push(most_recent_push.changeset, full='1') msg = push.changeset['desc'] LOG.debug("Found commit message:\n%s\n" % msg) branch = find_branch_in_merge_commit(msg) if not (branch and len(push.changesets) >= 2): # We did not find a branch, lets check the integration branches if we are bisecting m-c if get_name(most_recent_push.repo_name) == 'mozilla-central' and \ len(push.changesets) >= 2: branch = self._choose_integration_branch(most_recent_push.changeset) jp2 = JsonPushes(branch) try: data = jp2.pushes_within_changes( push.changesets[0]['node'], push.changesets[-1]['node']) except MozRegressionError: return LOG.info("************* Switching to %s by" " process of elimination (no branch detected in" " commit message)" % branch) return (branch, data[0].changeset, data[-1].changeset) else: return try: # so, this is a merge. We can find the oldest and youngest # changesets, and the branch where the merge comes from. oldest = push.changesets[0]['node'] # exclude the merge commit youngest = push.changesets[-2]['node'] LOG.debug("This is a merge from %s" % branch) # we can't use directly the youngest changeset because we # don't know yet if it is good. # # PUSH1 PUSH2 # [1 2] [3 4 5 6 7] # G MERGE B # # so first, grab it. This needs to be done on the right branch. jp2 = JsonPushes(branch) raw = [int(p.push_id) for p in jp2.pushes_within_changes(oldest, youngest)] data = jp2.pushes( startID=str(min(raw) - 2), endID=str(max(raw)), ) oldest = data[0].changesets[0] youngest = data[-1].changesets[-1] # we are ready to bisect further LOG.info("************* Switching to %s" % branch) gr, br = self._reverse_if_find_fix(oldest, youngest) result = (branch, gr, br) except MozRegressionError: LOG.debug("Got exception", exc_info=True) raise MozRegressionError( "Unable to exploit the merge commit. Origin branch is {}, and" " the commit message for {} was:\n{}".format( most_recent_push.repo_name, most_recent_push.short_changeset, msg ) ) LOG.debug('End merge handling') return result
def handle_merge(self): # let's check if we are facing a merge, and in that case, # continue the bisection from the merged branch. result = None LOG.debug("Starting merge handling...") # we have to check the commit of the most recent push most_recent_push = self.build_range[1] jp = JsonPushes(most_recent_push.repo_name) push = jp.push(most_recent_push.changeset, full='1') msg = push.changeset['desc'] LOG.debug("Found commit message:\n%s\n" % msg) branch = find_branch_in_merge_commit(msg) if not (branch and len(push.changesets) >= 2): # We did not find a branch, lets check the integration branches if we are bisecting m-c if get_name(most_recent_push.repo_name) == 'mozilla-central' and \ len(push.changesets) >= 2: branch = self._choose_integration_branch( most_recent_push.changeset) jp2 = JsonPushes(branch) try: data = jp2.pushes_within_changes( push.changesets[0]['node'], push.changesets[-1]['node']) except MozRegressionError: return LOG.info("************* Switching to %s by" " process of elimination (no branch detected in" " commit message)" % branch) return (branch, data[0].changeset, data[-1].changeset) else: return try: # so, this is a merge. We can find the oldest and youngest # changesets, and the branch where the merge comes from. oldest = push.changesets[0]['node'] # exclude the merge commit youngest = push.changesets[-2]['node'] LOG.debug("This is a merge from %s" % branch) # we can't use directly the youngest changeset because we # don't know yet if it is good. # # PUSH1 PUSH2 # [1 2] [3 4 5 6 7] # G MERGE B # # so first, grab it. This needs to be done on the right branch. jp2 = JsonPushes(branch) raw = [ int(p.push_id) for p in jp2.pushes_within_changes(oldest, youngest) ] data = jp2.pushes( startID=str(min(raw) - 2), endID=str(max(raw)), ) oldest = data[0].changesets[0] youngest = data[-1].changesets[-1] # we are ready to bisect further LOG.info("************* Switching to %s" % branch) gr, br = self._reverse_if_find_fix(oldest, youngest) result = (branch, gr, br) except MozRegressionError: LOG.debug("Got exception", exc_info=True) raise MozRegressionError( "Unable to exploit the merge commit. Origin branch is {}, and" " the commit message for {} was:\n{}".format( most_recent_push.repo_name, most_recent_push.short_changeset, msg)) LOG.debug('End merge handling') return result
def handle_merge(self): # let's check if we are facing a merge, and in that case, # continue the bisection from the merged branch. result = None LOG.debug("Starting merge handling...") # we have to check the commit of the most recent push most_recent_push = self.build_range[1] jp = JsonPushes(most_recent_push.repo_name) push = jp.push(most_recent_push.changeset, full="1") msg = push.changeset["desc"] LOG.debug("Found commit message:\n%s\n" % msg) branch = find_branch_in_merge_commit(msg, most_recent_push.repo_name) if not (branch and len(push.changesets) >= 2): # We did not find a branch, lets check the integration branches if we are bisecting m-c LOG.debug( "Did not find a branch, checking all integration branches") if (get_name(most_recent_push.repo_name) == "mozilla-central" and len(push.changesets) >= 2): branch = self._choose_integration_branch( most_recent_push.changeset) oldest = push.changesets[0]["node"] youngest = push.changesets[-1]["node"] LOG.info("************* Switching to %s by" " process of elimination (no branch detected in" " commit message)" % branch) else: return else: # so, this is a merge. see how many changesets are in it, if it # is just one, we have our answer if len(push.changesets) == 2: LOG.info("Merge commit has only two revisions (one of which " "is the merge): we are done") return # Otherwise, we can find the oldest and youngest # changesets, and the branch where the merge comes from. oldest = push.changesets[0]["node"] # exclude the merge commit youngest = push.changesets[-2]["node"] LOG.info("************* Switching to %s" % branch) # we can't use directly the oldest changeset because we # don't know yet if it is good. # # PUSH1 PUSH2 # [1 2] [3 4 5 6 7] # G MERGE B # # so first grab the previous push to get the last known good # changeset. This needs to be done on the right branch. try: jp2 = JsonPushes(branch) raw = [ int(p.push_id) for p in jp2.pushes_within_changes(oldest, youngest) ] data = jp2.pushes( startID=str(min(raw) - 2), endID=str(max(raw)), ) older = data[0].changeset youngest = data[-1].changeset # we are ready to bisect further gr, br = self._reverse_if_find_fix(older, youngest) result = (branch, gr, br) except MozRegressionError: LOG.debug("Got exception", exc_info=True) raise MozRegressionError( "Unable to exploit the merge commit. Origin branch is {}, and" " the commit message for {} was:\n{}".format( most_recent_push.repo_name, most_recent_push.short_changeset, msg)) LOG.debug("End merge handling") return result