Exemple #1
0
    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)
Exemple #3
0
    def migrate_related_tickets(self):
        """
        After github issues are already migrated, go back and udpate the descriptions to include "related tickets
        
        
        """

        gm = GithubIssueMaker()

        issue_cnt = 0
        redmine2github_issue_map = self.get_dict_from_map_file()

        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 Attempt 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.update_github_issue_with_related(json_fname_fullpath,
                                                redmine2github_issue_map)
    def migrate_related_tickets(self):
        """
        After github issues are already migrated, go back and udpate the descriptions to include "related tickets
        
        
        """
        
        gm = GithubIssueMaker()
         
        issue_cnt = 0
        redmine2github_issue_map = self.get_dict_from_map_file()
        
        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 Attempt 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.update_github_issue_with_related(json_fname_fullpath, redmine2github_issue_map)
Exemple #5
0
    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)