def migrate_issues(self): self.sanity_check() # Load a map if a filename was passed to the constructor # user_map_helper = self.get_user_map_helper() # None is ok # Note: for self.label_mapping_filename, None is ok gm = GithubIssueMaker(user_map_helper=user_map_helper\ , label_mapping_filename=self.label_mapping_filename\ , milestone_mapping_filename=self.milestone_mapping_filename ) # Iterate through json files issue_cnt = 0 mapping_dict = self.get_dict_from_map_file( ) # { redmine issue : github issue } for json_fname in self.get_redmine_json_fnames(): # Pull the issue number from the file name redmine_issue_num = int(json_fname.replace('.json', '')) # Start processing at or after redmine_issue_START_number if not redmine_issue_num >= self.redmine_issue_start_number: msg('Skipping Redmine issue: %s (start at %s)' % (redmine_issue_num, self.redmine_issue_start_number)) continue # skip tAttempt to create issue # his # Don't process after the redmine_issue_END_number if self.redmine_issue_end_number: if redmine_issue_num > self.redmine_issue_end_number: print redmine_issue_num, self.redmine_issue_end_number break issue_cnt += 1 msgt('(%s) Loading redmine issue: [%s] from file [%s]' % (issue_cnt, redmine_issue_num, json_fname)) json_fname_fullpath = os.path.join(self.redmine_json_directory, json_fname) gm_kwargs = { 'include_assignee' : self.include_assignee \ , 'include_comments' : self.include_comments \ } github_issue_number = gm.make_github_issue(json_fname_fullpath, **gm_kwargs) if github_issue_number: mapping_dict.update({redmine_issue_num: github_issue_number}) self.save_dict_to_file(mapping_dict) if issue_cnt % 50 == 0: msgt('sleep 1 seconds....') time.sleep(1)
def migrate_issues(self): self.sanity_check() # Load a map if a filename was passed to the constructor # user_map_helper = self.get_user_map_helper() # None is ok # Note: for self.label_mapping_filename, None is ok gm = GithubIssueMaker(user_map_helper=user_map_helper\ , label_mapping_filename=self.label_mapping_filename\ , milestone_mapping_filename=self.milestone_mapping_filename ) # Iterate through json files issue_cnt = 0 mapping_dict = self.get_dict_from_map_file() # { redmine issue : github issue } for json_fname in self.get_redmine_json_fnames(): # Pull the issue number from the file name redmine_issue_num = int(json_fname.replace('.json', '')) # Start processing at or after redmine_issue_START_number if not redmine_issue_num >= self.redmine_issue_start_number: msg('Skipping Redmine issue: %s (start at %s)' % (redmine_issue_num, self.redmine_issue_start_number )) continue # skip tAttempt to create issue # his # Don't process after the redmine_issue_END_number if self.redmine_issue_end_number: if redmine_issue_num > self.redmine_issue_end_number: print redmine_issue_num, self.redmine_issue_end_number break issue_cnt += 1 msgt('(%s) Loading redmine issue: [%s] from file [%s]' % (issue_cnt, redmine_issue_num, json_fname)) json_fname_fullpath = os.path.join(self.redmine_json_directory, json_fname) gm_kwargs = { 'include_assignee' : self.include_assignee \ , 'include_comments' : self.include_comments \ } github_issue_number = gm.make_github_issue(json_fname_fullpath, **gm_kwargs) if github_issue_number: mapping_dict.update({ redmine_issue_num : github_issue_number}) self.save_dict_to_file(mapping_dict) if issue_cnt % 50 == 0: msgt('sleep 1 seconds....') time.sleep(1)
def migrate_issues(self): self.sanity_check() # Load a map if a filename was passed to the constructor # user_map_helper = self.get_user_map_helper() # None is ok # Note: for self.label_mapping_filename, None is ok gm = GithubIssueMaker(user_map_helper=user_map_helper\ , label_mapping_filename=self.label_mapping_filename\ , milestone_mapping_filename=self.milestone_mapping_filename ) # Iterate through json files issue_cnt = 0 import_start_time = (datetime.utcnow() - timedelta(seconds = 10)).strftime("%Y-%m-%dT%H:%M:%SZ") rm_gh_id_map = self.get_dict_from_map_file() # { redmine issue : github issue } # temporary IDs assigned by github during issue import # we need to map these to redmine IDs, so they can be mapped to github issue numbers later gh_import_rm_map = dict() if self.insert_dummy_issues: loop_start = self.redmine_issue_start_number loop_end = self.redmine_issue_end_number + 1 else: loop_start = 0 loop_end = len(self.get_redmine_json_fnames()) for i in range(loop_start, loop_end): if not self.insert_dummy_issues: json_fname = self.get_redmine_json_fnames()[i] # Pull the issue number from the file name redmine_issue_num = int(json_fname.replace('.json', '')) # Start processing at or after redmine_issue_START_number if not redmine_issue_num >= self.redmine_issue_start_number: msg('Skipping Redmine issue: %s (start at %s)' % (redmine_issue_num, self.redmine_issue_start_number )) continue # skip attempt to create issue # Don't process after the redmine_issue_END_number if self.redmine_issue_end_number: if redmine_issue_num > self.redmine_issue_end_number: print(redmine_issue_num, self.redmine_issue_end_number) break else: redmine_issue_num = i # check if issue num exists in json files have_file = False json_fname = None for fn in self.get_redmine_json_fnames(): if redmine_issue_num == int(fn.replace('.json', '')): json_fname = fn break issue_cnt += 1 if json_fname: msgt('(%s) Loading redmine issue: [%s] from file [%s]' % (issue_cnt, redmine_issue_num, json_fname)) json_fname_fullpath = os.path.join(self.redmine_json_directory, json_fname) gm_kwargs = { 'include_assignee' : self.include_assignee \ , 'include_comments' : self.include_comments \ , 'include_redmine_links' : self.include_redmine_links \ } [ http_status, github_response, reset_epoch ] = gm.make_github_issue(json_fname_fullpath, **gm_kwargs) else: msgt('(%s) Creating dummy issue: [%s]' % (issue_cnt, redmine_issue_num)) [ http_status, github_response, reset_epoch ] = gm.make_dummy_issue() if http_status != 200 and http_status != 202: # if rate limit exceeded, wait until reset if "API rate limit exceeded" in github_response['message']: reset_time = datetime.fromtimestamp(int(reset_epoch)) - datetime.now() msg("Api limit exceeded, will reset in {}".format(reset_time)) reset_time += timedelta(seconds=10) msg("Sleeping for {} seconds".format(reset_time.seconds)) time.sleep(reset_time.seconds) if json_fname: [ http_status, github_response, reset_epoch ] = gm.make_github_issue(json_fname_fullpath, **gm_kwargs) else: [ http_status, github_response, reset_epoch ] = gm.make_dummy_issue() if http_status != 200 and http_status != 202: msgx('Error importing issue. github http response status %s. json received: %s' % (http_status, github_response)) print(github_response) github_import_num = github_response['id'] gh_import_rm_map[github_import_num] = redmine_issue_num # Need to keep issue imports to under 180 per minute, so pause every other issue if issue_cnt % 2 == 0: msgt('sleep 1 seconds....') time.sleep(1) # Also need to keep under 5000 total api calls every hour if issue_cnt % 50 == 0: msgt('sleep 1 seconds....') time.sleep(1) # get ids that have been imported since the start time import_to_id_map = gm.get_github_ids(import_start_time) print(import_to_id_map) for import_num, id_num in import_to_id_map.iteritems(): # look up the redmine ticket number from the import number, then map that to the final github issue id rm_gh_id_map.update({ gh_import_rm_map[import_num] : id_num}) #mapping_dict.update({ redmine_issue_num : github_issue_number}) self.save_dict_to_file(rm_gh_id_map)