From 3bb25e4922bb445e9b6ffa51e3e3ed02b84818e1 Mon Sep 17 00:00:00 2001 From: bilalbash Date: Thu, 19 May 2016 20:45:18 +0500 Subject: [PATCH 1/6] avoiding duplicate issues and comments while updating them --- gh-issues-import.py | 72 +++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/gh-issues-import.py b/gh-issues-import.py index ee354e0..37416aa 100755 --- a/gh-issues-import.py +++ b/gh-issues-import.py @@ -278,10 +278,10 @@ def import_label(source): print("Successfully created label '%s'" % result_label['name']) return result_label -def import_comments(comments, issue_number): +def import_comments(comments, issue_number, target_comments): result_comments = [] for comment in comments: - + template_data = {} template_data['user_name'] = comment['user']['login'] template_data['user_url'] = comment['user']['html_url'] @@ -289,16 +289,24 @@ def import_comments(comments, issue_number): template_data['date'] = format_date(comment['created_at']) template_data['url'] = comment['html_url'] template_data['body'] = comment['body'] - + comment['body'] = format_comment(template_data) - result_comment = send_request('target', "issues/%s/comments" % issue_number, comment) - result_comments.append(result_comment) - + result_comment = None + comment_exist = False + for i in target_comments: + if template_data['date'] in i['body']: + comment_exist = True + break + + if comment_exist is False: + result_comment = send_request('target', "issues/%s/comments" % issue_number, comment) + result_comments.append(result_comment) + return result_comments # Will only import milestones and issues that are in use by the imported issues, and do not exist in the target repository -def import_issues(issues): +def import_issues(issues, target_issues): state.current = state.GENERATING @@ -320,10 +328,11 @@ def get_label_by_name(name): new_labels = [] for issue in issues: - + new_issue = {} new_issue['title'] = issue['title'] - + new_issue['number'] = issue['number'] + # Temporary fix for marking closed issues if issue['closed_at']: new_issue['title'] = "[CLOSED] " + new_issue['title'] @@ -402,14 +411,30 @@ def get_label_by_name(name): issue_labels.append(label['name']) issue['labels'] = issue_labels del issue['label_objects'] - - result_issue = send_request('target', "issues", issue) - print("Successfully created issue '%s'" % result_issue['title']) - + + matching_issue = None + for i in target_issues: + if i['source_number'] == issue['number']: + matching_issue = i + + result_issue = None + print("") + if matching_issue is not None: + result_issue = matching_issue + print("Did'nt created '%s' because it already exists. Source issue # -> %s and Target issue # -> %s" % (issue['title'], issue['number'], matching_issue['number'])) + + else: + result_issue = send_request('target', "issues", issue) + print("Successfully created issue '%s'" % result_issue['title']) + + result_issue['comments'] = get_comments_on_issue('target', result_issue) if 'comments' in issue: - result_comments = import_comments(issue['comments'], result_issue['number']) + result_comments = import_comments(issue['comments'], result_issue['number'], result_issue['comments']) print(" > Successfully added", len(result_comments), "comments.") - + + else: + print(" > No comments for this issue") + result_issues.append(result_issue) state.current = state.IMPORT_COMPLETE @@ -423,27 +448,38 @@ def get_label_by_name(name): issue_ids = init_config() issues = [] + target_issues = [] state.current = state.FETCHING_ISSUES # Argparser will prevent us from getting both issue ids and specifying issue state, so no duplicates will be added if (len(issue_ids) > 0): issues += get_issues_by_id('source', issue_ids) + target_issues += get_issues_by_state('target', issue_ids) if config.getboolean('settings', 'import-open-issues'): issues += get_issues_by_state('source', 'open') - + target_issues += get_issues_by_state('target', 'open') + if config.getboolean('settings', 'import-closed-issues'): issues += get_issues_by_state('source', 'closed') + target_issues += get_issues_by_state('target', 'closed') # Sort issues based on their original `id` field # Confusing, but taken from http://stackoverflow.com/a/2878123/617937 issues.sort(key=lambda x:x['number']) - + + target_issues.sort(key=lambda x:x['number']) + + for issue in target_issues: + issue['source_number'] = int(issue['body'].split(str("%s/issues/" % config.get('source', 'repository')))[1].split('_\n')[0]) + # Further states defined within the function # Finally, add these issues to the target repository - import_issues(issues) + import_issues(issues, target_issues) state.current = state.COMPLETE + print("") + From cc97c211aef5af43bfb4ee26697b598516c25a3d Mon Sep 17 00:00:00 2001 From: bilalbash Date: Fri, 20 May 2016 01:14:40 +0500 Subject: [PATCH 2/6] fixed issue for issue ids --- gh-issues-import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gh-issues-import.py b/gh-issues-import.py index 37416aa..9e760a3 100755 --- a/gh-issues-import.py +++ b/gh-issues-import.py @@ -455,7 +455,7 @@ def get_label_by_name(name): # Argparser will prevent us from getting both issue ids and specifying issue state, so no duplicates will be added if (len(issue_ids) > 0): issues += get_issues_by_id('source', issue_ids) - target_issues += get_issues_by_state('target', issue_ids) + target_issues += get_issues_by_id('target', issue_ids) if config.getboolean('settings', 'import-open-issues'): issues += get_issues_by_state('source', 'open') From 1c9eba3164f231d8e47ff4ed90ab6b2a6cd1b165 Mon Sep 17 00:00:00 2001 From: bilalbash Date: Fri, 20 May 2016 01:34:08 +0500 Subject: [PATCH 3/6] fixed bug for issue ids --- gh-issues-import.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gh-issues-import.py b/gh-issues-import.py index 9e760a3..0098309 100755 --- a/gh-issues-import.py +++ b/gh-issues-import.py @@ -455,15 +455,14 @@ def get_label_by_name(name): # Argparser will prevent us from getting both issue ids and specifying issue state, so no duplicates will be added if (len(issue_ids) > 0): issues += get_issues_by_id('source', issue_ids) - target_issues += get_issues_by_id('target', issue_ids) if config.getboolean('settings', 'import-open-issues'): issues += get_issues_by_state('source', 'open') - target_issues += get_issues_by_state('target', 'open') + target_issues += get_issues_by_state('target', 'open') if config.getboolean('settings', 'import-closed-issues'): issues += get_issues_by_state('source', 'closed') - target_issues += get_issues_by_state('target', 'closed') + target_issues += get_issues_by_state('target', 'closed') # Sort issues based on their original `id` field # Confusing, but taken from http://stackoverflow.com/a/2878123/617937 From 0e37c17085fb299c2b8464c3afcd013bddbf32c0 Mon Sep 17 00:00:00 2001 From: bilalbash Date: Fri, 20 May 2016 12:43:45 +0500 Subject: [PATCH 4/6] fixed source number bug --- gh-issues-import.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gh-issues-import.py b/gh-issues-import.py index 0098309..51dafd8 100755 --- a/gh-issues-import.py +++ b/gh-issues-import.py @@ -471,7 +471,10 @@ def get_label_by_name(name): target_issues.sort(key=lambda x:x['number']) for issue in target_issues: - issue['source_number'] = int(issue['body'].split(str("%s/issues/" % config.get('source', 'repository')))[1].split('_\n')[0]) + try: + issue['source_number'] = int(issue['body'].split(str("%s/issues/" % config.get('source', 'repository')))[1].split('_\n')[0]) + except: + pass # Further states defined within the function # Finally, add these issues to the target repository From 640d956a04d839d580be7bea9c2bf3fae01c50de Mon Sep 17 00:00:00 2001 From: bilalbash Date: Fri, 20 May 2016 12:59:57 +0500 Subject: [PATCH 5/6] fixed source number bug 2 --- gh-issues-import.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gh-issues-import.py b/gh-issues-import.py index 51dafd8..7a13beb 100755 --- a/gh-issues-import.py +++ b/gh-issues-import.py @@ -414,8 +414,10 @@ def get_label_by_name(name): matching_issue = None for i in target_issues: - if i['source_number'] == issue['number']: - matching_issue = i + if 'source_number' in i: + if i['source_number'] == issue['number']: + matching_issue = i + break result_issue = None print("") From fb98897a72aa3a62abcf5a9920eaeec715da2a20 Mon Sep 17 00:00:00 2001 From: bilalbash Date: Fri, 20 May 2016 17:15:51 +0500 Subject: [PATCH 6/6] fixing commands issues --- gh-issues-import.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gh-issues-import.py b/gh-issues-import.py index 7a13beb..c5ecf94 100755 --- a/gh-issues-import.py +++ b/gh-issues-import.py @@ -457,15 +457,17 @@ def get_label_by_name(name): # Argparser will prevent us from getting both issue ids and specifying issue state, so no duplicates will be added if (len(issue_ids) > 0): issues += get_issues_by_id('source', issue_ids) + target_issues += get_issues_by_state('target', 'open') + target_issues += get_issues_by_state('target', 'closed') if config.getboolean('settings', 'import-open-issues'): issues += get_issues_by_state('source', 'open') - target_issues += get_issues_by_state('target', 'open') + target_issues += get_issues_by_state('target', 'open') if config.getboolean('settings', 'import-closed-issues'): issues += get_issues_by_state('source', 'closed') - target_issues += get_issues_by_state('target', 'closed') - + target_issues += get_issues_by_state('target', 'closed') + # Sort issues based on their original `id` field # Confusing, but taken from http://stackoverflow.com/a/2878123/617937 issues.sort(key=lambda x:x['number'])