def uplift(repo_dir, gaia_url, requirements): # Setup stuff t=util.time_start() print "Updating Gaia" git.create_gaia(repo_dir, gaia_url) # This is sadly broken print "Created Gaia in %0.2f seconds" % util.time_end(t) # Determining what needs to be uplifted with_commits = {} for bug_id in requirements.keys(): if requirements[bug_id].has_key('commits'): with_commits[bug_id] = requirements[bug_id] ordered_commits = order_commits(repo_dir, with_commits) uplift = dict([(x, {}) for x in ordered_commits]) # Uplifting for commit in ordered_commits: needed_on = [] for bug_id in with_commits.keys(): if commit in with_commits[bug_id]['commits']: for i in with_commits[bug_id]['needed_on']: if not i in needed_on: needed_on.append(i) print "\n", "="*80 print "Attempting to uplift %s commit to %s" % (commit, util.e_join(needed_on)) uplift[commit]['needed_on'] = needed_on result = uplift_commit(repo_dir, commit, needed_on) print "Sucess on %s" % util.e_join(result['success'].keys()) print "Failure on %s" % util.e_join(result['failure']) uplift[commit]['uplift_status'] = result uplift_report = copy.deepcopy(with_commits) # Determinging which commits belong to which bugs for bug_id in uplift_report.keys(): successful_branches = [] failed_branches = [] for commit in git.sort_commits(repo_dir, uplift_report[bug_id]['commits'], 'master'): if commit in uplift.keys(): if not uplift_report[bug_id].has_key('uplift_status'): uplift_report[bug_id]['uplift_status'] = {} u = uplift_report[bug_id]['uplift_status'] u[commit] = copy.deepcopy(uplift[commit]['uplift_status']) failed_branches.extend([x for x in u[commit]['failure'] if x not in failed_branches]) successful_branches.extend([x for x in u[commit]['success'].keys() if x not in successful_branches]) # Because we might have multiple commits, we want to make sure that the list of successful branches # includes only those with *no* failing uplifts for i in range(len(successful_branches) - 1, -1, -1): if successful_branches[i] in failed_branches: del successful_branches[i] uplift_report[bug_id]['flags_to_set'] = branch_logic.flags_to_set(successful_branches) util.write_json(uplift_dated_file, uplift_report) util.write_json(uplift_report_file, uplift_report) return uplift_report
def _raw_query(method, url, attempt=1, **kwargs): def write_log(): with open('uplift_api_calls.log', 'ab+') as f: # Scrubadubdub log_line['url'] = log_line['url'].replace(credentials['password'], '<password>') json.dump(log_line, f, indent=2) f.write(',\n') f.flush() log_line = { 'url': url, 'method': method, 'attempt': attempt } if kwargs.has_key('data'): log_line['request_data'] = kwargs['data'] t = util.time_start() try: r = requests.request(method, url, **kwargs) except requests.exceptions.RequestException as e: write_log() raise FailedBZAPICall(log_line) log_line['request_time'] = util.time_end(t) log_line['http_status'] = r.status_code if r.status_code == requests.codes.ok: try: data = r.json() except ValueError as e: log_line['bzapi_error'] = 'response was not json' write_log() raise FailedBZAPICall(log_line) if data.get('error', 0) != 0: log_line['bzapi_error'] = data['message'] write_log() raise FailedBZAPICall(data['message']) write_log() return data else: log_line['http_error'] = r.text write_log() try: r.raise_for_status() except urllib2.HTTPError as e: raise FailedBZAPICall(log_line)
def merge(repo_dir, gaia_url, branch_to, branch_from): git.delete_gaia(repo_dir) t = util.time_start() if os.path.exists(repo_dir): print "Updating Gaia" git.update_gaia(repo_dir, gaia_url) print "Updated Gaia in %0.2f seconds" % util.time_end(t) else: print "Creating Gaia" git.create_gaia(repo_dir, gaia_url) # This is sadly broken print "Created Gaia in %0.2f seconds" % util.time_end(t) print "Merging %s into branch %s" % (branch_from, branch_to) if not branch_to in git.branches(repo_dir): print >> sys.stderr, "Asking to merge into a branch that doesn't exist (%s)" % branch_to return None if not branch_from in git.branches(repo_dir): print >> sys.stderr, "Asking to merge from a branch that doesn't exist (%s)" % branch_from return None git.checkout(repo_dir, branch_to) start_commit = git.get_rev(repo_dir) git.merge(repo_dir, branch_from, strategy="recursive") end_commit = git.get_rev(repo_dir) print "Merge range is %s..%s" % (start_commit[:7], end_commit[:7]) print git.log(repo_dir, "%s..%s" % (start_commit, end_commit), pretty="oneline") print "Dry Run push" git.push(repo_dir, remote="origin", branches=[branch_to], dry_run=True) info = git.push(repo_dir, remote="origin", branches=[branch_to]) print "Would be pusing to %s" % info["url"] for branch in info["branches"].keys(): s, e = info["branches"][branch] print " %s: %s..%s" % (branch, s, e) if util.ask_yn("Push for realises?"): info = git.push(repo_dir, remote="origin", branches=[branch_to], dry_run=False) print "Pushed to %s" % info["url"] for branch in info["branches"].keys(): s, e = info["branches"][branch] print " %s: %s..%s" % (branch, s, e) comment(repo_dir, branch_to, "%s..%s" % (start_commit, end_commit))