def get_credentials_for(which):
		if not config.has_option(which, 'username'):
			if config.has_option('login', 'username'):
				config.set(which, 'username', config.get('login', 'username'))
			elif ( (which == 'target') and query.yes_no("Do you wish to use the same credentials for the target repository?") ):
				config.set('target', 'username', config.get('source', 'username'))
			else:
				query_str = "Enter your username for '%s' at '%s': " % (config.get(which, 'repository'), config.get(which, 'server'))
				config.set(which, 'username', query.username(query_str))
		
		if not config.has_option(which, 'password'):
			if config.has_option('login', 'password'):
				config.set(which, 'password', config.get('login', 'password'))
			elif ( (which == 'target') and config.get('source', 'username') == config.get('target', 'username') and config.get('source', 'server') == config.get('target', 'server') ):
				config.set('target', 'password', config.get('source', 'password'))
			else:
				query_str = "Enter your password for '%s' at '%s': " % (config.get(which, 'repository'), config.get(which, 'server'))
				config.set(which, 'password', query.password(query_str))

		if not config.has_option(which, 'token'):
			if config.has_option('login', 'token'):
				config.set(which, 'token', config.get('login', 'token'))
			elif ( (which == 'target') and query.yes_no("Do you wish to use the same credentials for the target repository?") ):
				config.set('target', 'token', config.get('source', 'token'))
			else:
				query_str = "Enter your token for '%s' at '%s': " % (config.get(which, 'repository'), config.get(which, 'server'))
				config.set(which, 'token', query.token(query_str))
Example #2
0
    def get_credentials_for(which):
        if not config.has_option(which, 'username'):
            if config.has_option('login', 'username'):
                config.set(which, 'username', config.get('login', 'username'))
            elif ((which == 'target') and query.yes_no(
                    "Do you wish to use the same credentials for the target repository?"
            )):
                config.set('target', 'username',
                           config.get('source', 'username'))
            else:
                query_str = "Enter your username for '%s' at '%s': " % (
                    config.get(which, 'repository'), config.get(
                        which, 'server'))
                config.set(which, 'username', query.username(query_str))

        if not config.has_option(which, 'password'):
            if config.has_option('login', 'password'):
                config.set(which, 'password', config.get('login', 'password'))
            elif ((which == 'target') and config.get('source', 'username')
                  == config.get('target', 'username') and config.get(
                      'source', 'server') == config.get('target', 'server')):
                config.set('target', 'password',
                           config.get('source', 'password'))
            else:
                query_str = "Enter your password for '%s' at '%s': " % (
                    config.get(which, 'repository'), config.get(
                        which, 'server'))
                config.set(which, 'password', query.password(query_str))
    def get_credentials_for(which):
        if not config.has_option(which, "username"):
            if config.has_option("login", "username"):
                config.set(which, "username", config.get("login", "username"))
            elif (which == "target") and query.yes_no(
                "Do you wish to use the same credentials for the target repository?"
            ):
                config.set("target", "username", config.get("source", "username"))
            else:
                query_str = "Enter your username for '%s' at '%s': " % (
                    config.get(which, "repository"),
                    config.get(which, "server"),
                )
                config.set(which, "username", query.username(query_str))

        if not config.has_option(which, "password"):
            if config.has_option("login", "password"):
                config.set(which, "password", config.get("login", "password"))
            elif (
                (which == "target")
                and config.get("source", "username") == config.get("target", "username")
                and config.get("source", "server") == config.get("target", "server")
            ):
                config.set("target", "password", config.get("source", "password"))
            else:
                query_str = "Enter your password for '%s' at '%s': " % (
                    config.get(which, "repository"),
                    config.get(which, "server"),
                )
                config.set(which, "password", query.password(query_str))
def import_issues(issues):

	state.current = state.GENERATING
	
	known_milestones = get_milestones('target')
	def get_milestone_by_title(title):
		for milestone in known_milestones:
			if milestone['title'] == title : return milestone
		return None
	
	known_labels = get_labels('target')
	def get_label_by_name(name):
		for label in known_labels:
			if label['name'] == name : return label
		return None
	
	new_issues = []
	num_new_comments = 0
	new_milestones = []
	new_labels = []
	
	for issue in issues:
		
		new_issue = {}
		new_issue['title'] = issue['title']
		
		# Temporary fix for marking closed issues
		if issue['closed_at']:
			new_issue['title'] = "[CLOSED] " + new_issue['title']
		
		if config.getboolean('settings', 'import-comments') and 'comments' in issue and issue['comments'] != 0:
			num_new_comments += int(issue['comments'])
			new_issue['comments'] = get_comments_on_issue('source', issue)
		
		if config.getboolean('settings', 'import-milestone') and 'milestone' in issue and issue['milestone'] is not None:
			# Since the milestones' ids are going to differ, we will compare them by title instead
			found_milestone = get_milestone_by_title(issue['milestone']['title'])
			if found_milestone:
				new_issue['milestone_object'] = found_milestone
			else:
				new_milestone = issue['milestone']
				new_issue['milestone_object'] = new_milestone
				known_milestones.append(new_milestone) # Allow it to be found next time
				new_milestones.append(new_milestone)   # Put it in a queue to add it later
		
		if config.getboolean('settings', 'import-labels') and 'labels' in issue and issue['labels'] is not None:
			new_issue['label_objects'] = []
			for issue_label in issue['labels']:
				found_label = get_label_by_name(issue_label['name'])
				if found_label:
					new_issue['label_objects'].append(found_label)
				else:
					new_issue['label_objects'].append(issue_label)
					known_labels.append(issue_label) # Allow it to be found next time
					new_labels.append(issue_label)   # Put it in a queue to add it later
		
		template_data = {}
		template_data['user_name'] = issue['user']['login']
		template_data['user_url'] = issue['user']['html_url']
		template_data['user_avatar'] = issue['user']['avatar_url']
		template_data['date'] = format_date(issue['created_at'])
		template_data['url'] =  issue['html_url']
		template_data['body'] = issue['body']
		
		if "pull_request" in issue and issue['pull_request']['html_url'] is not None:
			new_issue['body'] = format_pull_request(template_data)
		else:
			new_issue['body'] = format_issue(template_data)
		
		new_issues.append(new_issue)
	
	state.current = state.IMPORT_CONFIRMATION
	
	print("You are about to add to '" + config.get('target', 'repository') + "':")
	print(" *", len(new_issues), "new issues") 
	print(" *", num_new_comments, "new comments") 
	print(" *", len(new_milestones), "new milestones") 
	print(" *", len(new_labels), "new labels") 
	if not query.yes_no("Are you sure you wish to continue?"):
		sys.exit()
	
	state.current = state.IMPORTING
	
	for milestone in new_milestones:
		result_milestone = import_milestone(milestone)
		milestone['number'] = result_milestone['number']
		milestone['url'] = result_milestone['url']
	
	for label in new_labels:
		result_label = import_label(label)
	
	result_issues = []
	for issue in new_issues:
		
		if 'milestone_object' in issue:
			issue['milestone'] = issue['milestone_object']['number']
			del issue['milestone_object']
		
		if 'label_objects' in issue:
			issue_labels = []
			for label in issue['label_objects']:
				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'])
		
		if 'comments' in issue:
			result_comments = import_comments(issue['comments'], result_issue['number'])		
			print(" > Successfully added", len(result_comments), "comments.")
		
		result_issues.append(result_issue)
	
	state.current = state.IMPORT_COMPLETE
	
	return result_issues
Example #5
0
def import_issues(issues):

    state.current = state.GENERATING

    known_milestones = get_milestones('target')

    def get_milestone_by_title(title):
        for milestone in known_milestones:
            if milestone['title'] == title:
                return milestone
        return None

    known_labels = get_labels('target')

    def get_label_by_name(name):
        for label in known_labels:
            if label['name'] == name:
                return label
        return None

    new_issues = []
    num_new_comments = 0
    new_milestones = []
    new_labels = []

    for issue in issues:

        new_issue = {}
        new_issue['title'] = issue['title']

        # Temporary fix for marking closed issues
        if issue['closed_at']:
            new_issue['title'] = "[CLOSED] " + new_issue['title']

        if config.getboolean(
                'settings', 'import-comments'
        ) and 'comments' in issue and issue['comments'] != 0:
            num_new_comments += int(issue['comments'])
            new_issue['comments'] = get_comments_on_issue('source', issue)

        if config.getboolean(
                'settings', 'import-milestone'
        ) and 'milestone' in issue and issue['milestone'] is not None:
            # Since the milestones' ids are going to differ, we will compare them by title instead
            found_milestone = get_milestone_by_title(
                issue['milestone']['title'])
            if found_milestone:
                new_issue['milestone_object'] = found_milestone
            else:
                new_milestone = issue['milestone']
                new_issue['milestone_object'] = new_milestone
                known_milestones.append(
                    new_milestone)  # Allow it to be found next time
                new_milestones.append(
                    new_milestone)  # Put it in a queue to add it later

        if config.getboolean(
                'settings', 'import-labels'
        ) and 'labels' in issue and issue['labels'] is not None:
            new_issue['label_objects'] = []
            for issue_label in issue['labels']:
                found_label = get_label_by_name(issue_label['name'])
                if found_label:
                    new_issue['label_objects'].append(found_label)
                else:
                    new_issue['label_objects'].append(issue_label)
                    known_labels.append(
                        issue_label)  # Allow it to be found next time
                    new_labels.append(
                        issue_label)  # Put it in a queue to add it later

        template_data = {}
        template_data['user_name'] = issue['user']['login']
        template_data['user_url'] = issue['user']['html_url']
        template_data['user_avatar'] = issue['user']['avatar_url']
        template_data['date'] = format_date(issue['created_at'])
        template_data['url'] = issue['html_url']
        template_data['body'] = issue['body']

        if "pull_request" in issue and issue['pull_request'][
                'html_url'] is not None:
            new_issue['body'] = format_pull_request(template_data)
        else:
            new_issue['body'] = format_issue(template_data)

        new_issues.append(new_issue)

    state.current = state.IMPORT_CONFIRMATION

    print("You are about to add to '" + config.get('target', 'repository') +
          "':")
    print(" *", len(new_issues), "new issues")
    print(" *", num_new_comments, "new comments")
    print(" *", len(new_milestones), "new milestones")
    print(" *", len(new_labels), "new labels")
    if not query.yes_no("Are you sure you wish to continue?"):
        sys.exit()

    state.current = state.IMPORTING

    for milestone in new_milestones:
        result_milestone = import_milestone(milestone)
        milestone['number'] = result_milestone['number']
        milestone['url'] = result_milestone['url']

    for label in new_labels:
        import_label(label)

    result_issues = []
    for issue in new_issues:

        if 'milestone_object' in issue:
            issue['milestone'] = issue['milestone_object']['number']
            del issue['milestone_object']

        if 'label_objects' in issue:
            issue_labels = []
            for label in issue['label_objects']:
                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'])

        if 'comments' in issue:
            result_comments = import_comments(issue['comments'],
                                              result_issue['number'])
            print(" > Successfully added", len(result_comments), "comments.")

        result_issues.append(result_issue)

    state.current = state.IMPORT_COMPLETE

    return result_issues
Example #6
0
def import_issues(issues):

    state.current = state.GENERATING

    known_milestones = get_milestones('target')

    def get_milestone_by_title(title):
        for milestone in known_milestones:
            if milestone['title'] == title: return milestone
        return None

    known_labels = get_labels('target')

    def get_label_by_name(name):
        for label in known_labels:
            if label['name'].lower() == name.lower(): return label
        return None

    new_issues = []
    open_issue_ids = []
    closed_issue_ids = []
    pull_request_ids = []
    num_new_comments = 0
    new_milestones = []
    new_labels = []

    for issue in issues:

        new_issue = {}
        new_issue['title'] = issue['title']
        # note: id will not be created remotely, used for local dereferencing
        # note: id is not the same as number
        new_issue['id'] = issue['id']
        #print (issue)
        if (issue['number'] < config.get('source', 'resume')):
            continue

        if issue['state'] == 'open':
            open_issue_ids.append(issue['id'])
        elif issue['state'] == 'closed':
            closed_issue_ids.append(issue['id'])

        new_issue['title'] = "[#" + str(
            issue['number']) + "] " + new_issue['title']

        if config.getboolean(
                'settings', 'import-comments'
        ) and 'comments' in issue and issue['comments'] != 0:
            num_new_comments += int(issue['comments'])
            new_issue['comments'] = get_comments_on_issue('source', issue)

        if config.getboolean(
                'settings', 'import-milestone'
        ) and 'milestone' in issue and issue['milestone'] is not None:
            # Since the milestones' ids are going to differ, we will compare them by title instead
            found_milestone = get_milestone_by_title(
                issue['milestone']['title'])
            if found_milestone:
                new_issue['milestone_object'] = found_milestone
            else:
                new_milestone = issue['milestone']
                new_issue['milestone_object'] = new_milestone
                known_milestones.append(
                    new_milestone)  # Allow it to be found next time
                new_milestones.append(
                    new_milestone)  # Put it in a queue to add it later

        if config.getboolean(
                'settings', 'import-labels'
        ) and 'labels' in issue and issue['labels'] is not None:
            new_issue['label_objects'] = []
            for issue_label in issue['labels']:
                found_label = get_label_by_name(issue_label['name'])
                if found_label:
                    new_issue['label_objects'].append(found_label)
                else:
                    new_issue['label_objects'].append(issue_label)
                    known_labels.append(
                        issue_label)  # Allow it to be found next time
                    new_labels.append(
                        issue_label)  # Put it in a queue to add it later

        template_data = {}
        template_data['user_name'] = issue['user']['login']
        template_data['user_url'] = issue['user']['html_url']
        template_data['user_avatar'] = issue['user']['avatar_url']
        template_data['date'] = format_date(issue['created_at'])
        template_data['url'] = issue['html_url']
        template_data['body'] = issue['body']

        if 'pull_request' in issue:
            if config.getboolean('settings', 'import-pulls'):
                pull_request_ids.append(issue['id'])
                if issue['pull_request']['html_url'] is not None:
                    new_issue['body'] = format_pull_request(template_data)
            else:
                continue  # skip this (pull request) issue
        else:  # regular issue, not a pull request
            new_issue['body'] = format_issue(template_data)

        new_issues.append(new_issue)

    state.current = state.IMPORT_CONFIRMATION

    print("You are about to add to '" + config.get('target', 'repository') +
          "':")
    print(" *", len(open_issue_ids), "open issues")
    print(" *", len(closed_issue_ids), "closed issues")
    print(" *", len(pull_request_ids), "pull requests")
    print(" *", num_new_comments, "new comments")
    print(" *", len(new_milestones), "new milestones")
    print(" *", len(new_labels), "new labels")
    if not query.yes_no("Are you sure you wish to continue?"):
        sys.exit()

    state.current = state.IMPORTING

    for milestone in new_milestones:
        result_milestone = import_milestone(milestone)
        milestone['number'] = result_milestone['number']
        milestone['url'] = result_milestone['url']

    for label in new_labels:
        result_label = import_label(label)

    result_issues = []
    for issue in new_issues:

        if 'milestone_object' in issue:
            issue['milestone'] = issue['milestone_object']['number']
            del issue['milestone_object']

        if 'label_objects' in issue:
            issue_labels = []
            for label in issue['label_objects']:
                issue_labels.append(label['name'])
            issue['labels'] = issue_labels
            del issue['label_objects']

        sys.stdout.flush()
        sleep_rate_limiting()

        result_issue = send_request('target', "issues", issue)
        print("Successfully created issue '%s'" % result_issue['title'])
        if issue['id'] in closed_issue_ids:
            issue['state'] = 'closed'
            patch_issue('target', result_issue['number'], issue)
        if 'comments' in issue:
            result_comments = import_comments(issue['comments'],
                                              result_issue['number'])
            print(" > Successfully added", len(result_comments), "comments.")

        result_issues.append(result_issue)

    state.current = state.IMPORT_COMPLETE

    return result_issues
def import_issues(state, issues):

    known_milestones = get_milestones("target", state, target_url)

    def get_milestone_by_title(title):
        for milestone in known_milestones:
            if milestone["title"] == title:
                return milestone
        return None

    known_labels = get_labels("target", target_url)

    def get_label_by_name(name):
        for label in known_labels:
            if label["name"] == name:
                return label
        return None

    new_issues = []
    closed_issues = []
    num_new_comments = 0
    new_milestones = []
    new_labels = []

    for issue in issues:
        new_issue = {}
        new_issue["title"] = issue["title"]
        if config.getboolean("settings", "import-comments") and "comments" in issue and issue["comments"] != 0:
            num_new_comments += int(issue["comments"])
            new_issue["comments"] = get_comments_on_issue("source", issue)

        if (
            config.getboolean("settings", "import-milestone")
            and "milestone" in issue
            and issue["milestone"] is not None
        ):
            # Since the milestones' ids are going to differ, we will compare them by title instead
            found_milestone = get_milestone_by_title(issue["milestone"]["title"])
            if found_milestone:
                new_issue["milestone_object"] = found_milestone
            else:
                new_milestone = issue["milestone"]
                new_issue["milestone_object"] = new_milestone
                known_milestones.append(new_milestone)  # Allow it to be found next time
                new_milestones.append(new_milestone)  # Put it in a queue to add it later

        if config.getboolean("settings", "import-labels") and "labels" in issue and issue["labels"] is not None:
            new_issue["label_objects"] = []
            for issue_label in issue["labels"]:
                found_label = get_label_by_name(issue_label["name"])
                if found_label:
                    new_issue["label_objects"].append(found_label)
                else:
                    new_issue["label_objects"].append(issue_label)
                    known_labels.append(issue_label)  # Allow it to be found next time
                    new_labels.append(issue_label)  # Put it in a queue to add it later

        template_data = {}
        template_data["issue_creator_username"] = issue["user"]["login"]
        template_data["issue_creator_url"] = issue["user"]["html_url"]
        template_data["issue_date"] = format_date(issue["created_at"])
        template_data["issue_url"] = issue["html_url"]
        template_data["issue_body"] = issue["body"]

        if "pull_request" in issue and issue["pull_request"]["html_url"] is not None:
            new_issue["body"] = format_pull_request(template_data)
        else:
            new_issue["body"] = format_issue(template_data)

        new_issues.append(new_issue)

        if issue["state"] == "closed":
            close_issue = {}
            close_issue["number"] = issue["number"]
            close_issue["state"] = "closed"
            closed_issues.append(close_issue)

    print("You are about to add to '" + config.get("target", "repository") + "':")
    print(" *", len(new_issues), "creating issues")
    print(" *", len(closed_issues), "closing issues")
    print(" *", num_new_comments, "new comments")
    print(" *", len(new_milestones), "new milestones")
    print(" *", len(new_labels), "new labels")
    if not query.yes_no("Are you sure you wish to continue?"):
        sys.exit()

    for milestone in new_milestones:
        result_milestone = import_milestone(state, milestone)
        milestone["number"] = result_milestone["number"]
        milestone["url"] = result_milestone["url"]

    for label in new_labels:
        result_label = import_label(label)

    result_issues = []
    for issue in new_issues:
        if "milestone_object" in issue:
            issue["milestone"] = issue["milestone_object"]["number"]
            del issue["milestone_object"]

        if "label_objects" in issue:
            issue_labels = []
            for label in issue["label_objects"]:
                issue_labels.append(label["name"])
            issue["labels"] = issue_labels
            del issue["label_objects"]

        result_issue = send_request("target", "%s/issues" % target_url, issue)
        print("Successfully created issue '%s'" % result_issue["title"])

        if "comments" in issue:
            result_comments = import_comments(issue["comments"], result_issue["number"])
            print(" > Successfully added", len(result_comments), "comments.")

        result_issues.append(result_issue)

    for issue in closed_issues:
        result_issue = send_request("target", "%s/issues/%d" % (target_url, issue["number"]), issue, "PATCH")
        print("Successfully closed issue '%s'" % result_issue["title"])

        # result_issues.append(result_issue)

    return result_issues
def import_issues(issues):

	state.current = state.GENERATING

	known_milestones = get_milestones('target')
	def get_milestone_by_title(title):
		for milestone in known_milestones:
			if milestone['title'] == title : return milestone
		return None
	
	known_labels = get_labels('target')
	def get_label_by_name(name):
		# Github labels are case-insensitive
		for label in known_labels:
			if label['name'].upper() == name.upper():
				return label
		return None
	
	new_issues = []
	num_new_comments = 0
	num_new_events = 0
	new_milestones = []
	new_labels = []
	
	for issue in issues:
		
		new_issue = {}
		new_issue['orig_issue_number'] = issue['number']
		new_issue['title'] = issue['title']
		
		if issue.get('assignee') is not None and 'login' in issue['assignee']:
			new_issue['assignee'] = issue['assignee']['login']
		
		if issue['closed_at']:
			new_issue['orig_issue_closed'] = True
		
		if config.getboolean('settings', 'import-comments') and 'comments' in issue and issue['comments'] != 0:
			num_new_comments += int(issue['comments'])
			new_issue['comments'] = get_comments_on_issue('source', issue)
		
		if config.getboolean('settings', 'import-events'):
			new_issue['events'] = get_events_on_issue('source', issue)
			num_new_events += len(new_issue['events'])
		
		if config.getboolean('settings', 'import-milestone') and 'milestone' in issue and issue['milestone'] is not None:
			# Since the milestones' ids are going to differ, we will compare them by title instead
			found_milestone = get_milestone_by_title(issue['milestone']['title'])
			if found_milestone:
				new_issue['milestone_object'] = found_milestone
			else:
				new_milestone = issue['milestone']
				new_issue['milestone_object'] = new_milestone
				known_milestones.append(new_milestone) # Allow it to be found next time
				new_milestones.append(new_milestone)   # Put it in a queue to add it later
		
		if config.getboolean('settings', 'import-labels') and 'labels' in issue and issue['labels'] is not None:
			new_issue['label_objects'] = []
			for issue_label in issue['labels']:
				found_label = get_label_by_name(issue_label['name'])
				if found_label:
					new_issue['label_objects'].append(found_label)
				else:
					new_issue['label_objects'].append(issue_label)
					known_labels.append(issue_label) # Allow it to be found next time
					new_labels.append(issue_label)   # Put it in a queue to add it later
		
		template_data = {}
		template_data['user_name'] = issue['user']['login']
		template_data['user_url'] = issue['user']['html_url']
		template_data['user_avatar'] = issue['user']['avatar_url']
		template_data['date'] = format_date(issue['created_at'])
		template_data['url'] =  issue['html_url']
		template_data['body'] = issue['body']
		
		if "pull_request" in issue and issue['pull_request']['html_url'] is not None:
			new_issue['body'] = format_pull_request(template_data)
		else:
			new_issue['body'] = format_issue(template_data)
		
		new_issues.append(new_issue)

	if config.getboolean('settings', 'dry_run'):
		progress_msg('Dry run complete')
		state.current = state.COMPLETE
		sys.exit()
	
	state.current = state.IMPORT_CONFIRMATION
	
	print("You are about to add to '" + config.get('target', 'repository') + "':")
	print(" *", len(new_issues), "new issues") 
	print(" *", num_new_comments, "new comments") 
	print(" *", num_new_events, "new events") 
	print(" *", len(new_milestones), "new milestones") 
	print(" *", len(new_labels), "new labels") 
	if not config.getboolean('settings', 'yes'):
		if not query.yes_no("Are you sure you wish to continue?"):
			sys.exit()
	print()
	
	state.current = state.IMPORTING
	
	for milestone in new_milestones:
		result_milestone = import_milestone(milestone)
		milestone['number'] = result_milestone['number']
		milestone['url'] = result_milestone['url']
	
	for label in new_labels:
		result_label = import_label(label)
	
	result_issues = []
	for issue in new_issues:
		
		if 'milestone_object' in issue:
			issue['milestone'] = issue['milestone_object']['number']
			del issue['milestone_object']
		
		if 'label_objects' in issue:
			issue_labels = []
			for label in issue['label_objects']:
				issue_labels.append(label['name'])
			issue['labels'] = issue_labels
			del issue['label_objects']
		
		orig_issue_number = issue['orig_issue_number']
		del issue['orig_issue_number']
		orig_issue_closed = False
		if issue.get('orig_issue_closed') is not None:
			orig_issue_closed = True
			del issue['orig_issue_closed']

		issue_comments = None
		if 'comments' in issue:
			issue_comments = issue['comments']
			del issue['comments']
		issue_events = None
		if 'events' in issue:
			issue_events = issue['events']
			del issue['events']
		
		progress_msg('Creating new issue for original issue {0}, assignee: {1}'.format(orig_issue_number, issue.get('assignee')))
		progress_msg(' > {0}'.format(issue['title']))
		
		result_issue = send_request('target', "issues", issue, can_retry=False)
		progress_msg(' > Created issue {0} for original issue {1}'.format(result_issue['number'], orig_issue_number))
		
		if (issue_comments is not None and len(issue_comments) > 0) or (issue_events is not None and len(issue_events) > 0):
			import_comments_and_events(issue_comments, issue_events, result_issue['number'])
		
		if orig_issue_closed:
			progress_msg(' > Original issue {0} is CLOSED, closing the new issue {1}'.format(orig_issue_number, result_issue['number']))
			update_data = { 'state' : 'closed' }
			send_request('target', "issues/{0}".format(result_issue['number']), update_data)
		
		if config.getboolean('settings', 'lock_after_migrate'):
			progress_msg(' > Lock the original issue {0}'.format(orig_issue_number))
			send_request('source', "issues/{0}/lock".format(orig_issue_number), method="PUT", content_length=0, custom_media_type='application/vnd.github.the-key-preview+json')
			lock_comment_body = "**ISSUE HAS BEEN MIGRATED. PLEASE DO NOT ADD ANY UPDATES.**"
			lock_comment = {'body' : lock_comment_body}
			send_request('source', "issues/{0}/comments".format(orig_issue_number), lock_comment)
		
		result_issues.append(result_issue)
		
		progress_msg()
		time.sleep(5)
	
	state.current = state.IMPORT_COMPLETE
	
	return result_issues
def import_issues(issues):

    state.current = state.GENERATING

    known_milestones = get_milestones('target')

    def get_milestone_by_title(title):
        for milestone in known_milestones:
            if milestone['title'] == title: return milestone
        return None

    known_labels = get_labels('target')

    def get_label_by_name(name):
        # Github labels are case-insensitive
        for label in known_labels:
            if label['name'].upper() == name.upper():
                return label
        return None

    new_issues = []
    num_new_comments = 0
    num_new_events = 0
    new_milestones = []
    new_labels = []

    for issue in issues:

        new_issue = {}
        new_issue['orig_issue_number'] = issue['number']
        new_issue['title'] = issue['title']
        new_assignees = []

        # Convert assignees to devtopia accout according to assigneeDict
        if issue.get('assignees') is not None:
            for assignee in issue.get('assignees'):
                oldAssignee = assignee['login']

                if oldAssignee in assigneeDict:
                    newAssignee = convert_assignee(oldAssignee)
                    new_assignees.append(newAssignee)

            new_issue['assignees'] = new_assignees

        if issue['closed_at']:
            new_issue['orig_issue_closed'] = True

        if config.getboolean(
                'settings', 'import-comments'
        ) and 'comments' in issue and issue['comments'] != 0:
            num_new_comments += int(issue['comments'])
            new_issue['comments'] = get_comments_on_issue('source', issue)

        if config.getboolean('settings', 'import-events'):
            new_issue['events'] = get_events_on_issue('source', issue)
            num_new_events += len(new_issue['events'])

        if config.getboolean(
                'settings', 'import-milestone'
        ) and 'milestone' in issue and issue['milestone'] is not None:
            # Since the milestones' ids are going to differ, we will compare them by title instead
            found_milestone = get_milestone_by_title(
                issue['milestone']['title'])
            if found_milestone:
                new_issue['milestone_object'] = found_milestone
            else:
                new_milestone = issue['milestone']
                new_issue['milestone_object'] = new_milestone
                known_milestones.append(
                    new_milestone)  # Allow it to be found next time
                new_milestones.append(
                    new_milestone)  # Put it in a queue to add it later

        if config.getboolean(
                'settings', 'import-labels'
        ) and 'labels' in issue and issue['labels'] is not None:
            new_issue['label_objects'] = []
            for issue_label in issue['labels']:
                found_label = get_label_by_name(issue_label['name'])
                if found_label:
                    new_issue['label_objects'].append(found_label)
                else:
                    new_issue['label_objects'].append(issue_label)
                    known_labels.append(
                        issue_label)  # Allow it to be found next time
                    new_labels.append(
                        issue_label)  # Put it in a queue to add it later

        template_data = {}
        template_data['user_name'] = issue['user']['login']
        template_data['user_url'] = issue['user']['html_url']
        template_data['user_avatar'] = issue['user']['avatar_url']
        template_data['date'] = format_date(issue['created_at'])
        template_data['url'] = issue['html_url']
        template_data['body'] = issue['body']

        if "pull_request" in issue and issue['pull_request'][
                'html_url'] is not None:
            new_issue['body'] = format_pull_request(template_data)
        else:
            new_issue['body'] = format_issue(template_data)

        new_issues.append(new_issue)

    if config.getboolean('settings', 'dry_run'):
        progress_msg('Dry run complete')
        state.current = state.COMPLETE
        sys.exit()

    state.current = state.IMPORT_CONFIRMATION

    print("You are about to add to '" + config.get('target', 'repository') +
          "':")
    print(" *", len(new_issues), "new issues")
    print(" *", num_new_comments, "new comments")
    print(" *", num_new_events, "new events")
    print(" *", len(new_milestones), "new milestones")
    print(" *", len(new_labels), "new labels")
    if not config.getboolean('settings', 'yes'):
        if not query.yes_no("Are you sure you wish to continue?"):
            sys.exit()
    print()

    state.current = state.IMPORTING

    for milestone in new_milestones:
        result_milestone = import_milestone(milestone)
        milestone['number'] = result_milestone['number']
        milestone['url'] = result_milestone['url']

    for label in new_labels:
        result_label = import_label(label)

    result_issues = []
    for issue in new_issues:

        if 'milestone_object' in issue:
            issue['milestone'] = issue['milestone_object']['number']
            del issue['milestone_object']

        if 'label_objects' in issue:
            issue_labels = []
            for label in issue['label_objects']:
                issue_labels.append(label['name'])
            issue['labels'] = issue_labels
            del issue['label_objects']

        orig_issue_number = issue['orig_issue_number']
        del issue['orig_issue_number']
        orig_issue_closed = False
        if issue.get('orig_issue_closed') is not None:
            orig_issue_closed = True
            del issue['orig_issue_closed']

        issue_comments = None
        if 'comments' in issue:
            issue_comments = issue['comments']
            del issue['comments']
        issue_events = None
        if 'events' in issue:
            issue_events = issue['events']
            del issue['events']

        progress_msg(
            'Creating new issue for original issue {0}, assignee: {1}'.format(
                orig_issue_number, issue.get('assignee')))
        progress_msg(' > {0}'.format(issue['title']))
        print()

        result_issue = send_request('target', "issues", issue, can_retry=False)
        progress_msg(' > Created issue {0} for original issue {1}'.format(
            result_issue['number'], orig_issue_number))

        if (issue_comments is not None
                and len(issue_comments) > 0) or (issue_events is not None
                                                 and len(issue_events) > 0):
            import_comments_and_events(issue_comments, issue_events,
                                       result_issue['number'])

        if orig_issue_closed:
            progress_msg(
                ' > Original issue {0} is CLOSED, closing the new issue {1}'.
                format(orig_issue_number, result_issue['number']))
            update_data = {'state': 'closed'}
            send_request('target', "issues/{0}".format(result_issue['number']),
                         update_data)

        if config.getboolean('settings', 'lock_after_migrate'):
            progress_msg(
                ' > Lock the original issue {0}'.format(orig_issue_number))
            send_request(
                'source',
                "issues/{0}/lock".format(orig_issue_number),
                method="PUT",
                content_length=0,
                custom_media_type='application/vnd.github.the-key-preview+json'
            )
            lock_comment_body = "**ISSUE HAS BEEN MIGRATED. PLEASE DO NOT ADD ANY UPDATES.**"
            lock_comment = {'body': lock_comment_body}
            send_request('source',
                         "issues/{0}/comments".format(orig_issue_number),
                         lock_comment)

        result_issues.append(result_issue)

        progress_msg()
        time.sleep(5)

    state.current = state.IMPORT_COMPLETE

    return result_issues
Example #10
0
def import_audio():
    root_path = os.path.abspath(os.path.dirname(__file__))

    delete_files = query.yes_no(_(
        "Do you wish to delete the original files when they have been "
        "transcoded and the data added to the database?"
    ))

    # List all files to be imported and loop through them.
    input_dir = os.path.normpath(os.path.join(root_path, "new-audio"))
    files = os.listdir(input_dir)
    for file in files:
        file = file
        print("\n" + _("Current file: {file}").format(file=file))
        full_path = os.path.join(input_dir, file)

        # Extract meta data
        if file.endswith(".wma"):
            meta_data = read_wma(full_path)
        else:
            # Unknown file format, continue with next file in the list
            print(_("Unknown file format {file_name}").format(
                file_name=file))
            continue

        # Start transcoding thread
        temp_path = os.path.normpath(os.path.join(
            root_path, "downloads", "audiofiles", "new.ogg"))
        transcode_thread = threading.Thread(
            target=transcode, args=(full_path, temp_path, delete_files))
        transcode_thread.start()

        # Dictionary with data for the database
        track_data = {
            "title": "",
            "artists": [],
            "album": {"title": ""}
        }

        # MusicBrainz lookup of all id strings
        mb_release_year = mb.get_release_year(meta_data["album_mbid"])
        mb_artists = []
        for artist in meta_data["artists_mbid"]:
            mb_artists.append(mb.get_artist_name(artist))

        # Go through all data with the user
        if mb_release_year is not meta_data["album_year"]:
            use_mb = query.yes_no(_(
                "The file's meta data says the album was released in "
                "{year1}, but MusicBrainz says {year2}. Do you want to use "
                "the year provided by MusicBrainz?").format(
                year1=meta_data["album_year"], year2=mb_release_year), True)
            if use_mb:
                track_data["album"]["year"] = mb_release_year
            else:
                track_data["album"]["year"] = meta_data["album_year"]

        # Ask "Is ARTIST the same as ARTIST in the database?" if similar artist
        # Aks "Is ALBUM the same as ALBUM in the database?" if similar album

        # User querying done, rejoin threads
        if transcode_thread.is_alive():
            print(_("One moment, waiting for the transcoding."))
        transcode_thread.join()

        # Add track_data to database

        # Rename the temporary file created by the transcoder
        new_path = os.path.normpath(os.path.join(
            root_path, "downloads", "audiofiles", "database-id.ogg"))
        os.rename(temp_path, new_path)
def import_issues_golden_comet(issues):
    state.current = state.GENERATING

    known_milestones = get_milestones('target')

    def get_milestone_by_title(title):
        for milestone in known_milestones:
            if milestone['title'] == title: return milestone
        return None

    known_labels = get_labels('target')

    def get_label_by_name(name):
        for label in known_labels:
            if label['name'] == name: return label
        return None

    issue_migrations = []
    new_milestones = []
    num_new_comments = 0
    new_labels = []

    for issue in issues:
        issue_migration = {}
        new_issue = {}
        new_issue['title'] = issue['title']
        if issue['closed_at'] is not None:
            new_issue['closed_at'] = issue['closed_at']
            new_issue['closed'] = True
        new_issue['created_at'] = issue['created_at']
        new_issue['updated_at'] = issue['updated_at']
        # TODO new_issue['assignee'] = issue['assignee']

        if config.getboolean(
                'settings', 'import-milestone'
        ) and 'milestone' in issue and issue['milestone'] is not None:
            # Since the milestones' ids are going to differ, we will compare them by title instead
            found_milestone = get_milestone_by_title(
                issue['milestone']['title'])
            if found_milestone:
                new_issue['milestone_object'] = found_milestone
            else:
                new_milestone = issue['milestone']
                new_issue['milestone_object'] = new_milestone
                known_milestones.append(
                    new_milestone)  # Allow it to be found next time
                new_milestones.append(
                    new_milestone)  # Put it in a queue to add it later

        if config.getboolean(
                'settings', 'import-labels'
        ) and 'labels' in issue and issue['labels'] is not None:
            new_issue['label_objects'] = []
            for issue_label in issue['labels']:
                found_label = get_label_by_name(issue_label['name'])
                if found_label:
                    new_issue['label_objects'].append(found_label)
                else:
                    new_issue['label_objects'].append(issue_label)
                    known_labels.append(
                        issue_label)  # Allow it to be found next time
                    new_labels.append(
                        issue_label)  # Put it in a queue to add it later

        comments = []
        if config.getboolean(
                'settings', 'import-comments'
        ) and 'comments' in issue and issue['comments'] != 0:
            num_new_comments += int(issue['comments'])
            original_comments = get_comments_on_issue('source', issue)
            for original_comment in original_comments:
                comment = {}
                ctemplate_data = {}
                ctemplate_data['user_name'] = original_comment['user']['login']
                ctemplate_data['user_url'] = original_comment['user'][
                    'html_url']
                ctemplate_data['user_avatar'] = original_comment['user'][
                    'avatar_url']
                ctemplate_data['date'] = format_date(
                    original_comment['created_at'])
                ctemplate_data['url'] = original_comment['html_url']
                ctemplate_data['body'] = original_comment['body']

                comment['body'] = format_comment(ctemplate_data)
                comment['created_at'] = original_comment['created_at']
                comments.append(comment)

        template_data = {}
        template_data['user_name'] = issue['user']['login']
        template_data['user_url'] = issue['user']['html_url']
        template_data['user_avatar'] = issue['user']['avatar_url']
        template_data['date'] = format_date(issue['created_at'])
        template_data['url'] = issue['html_url']
        template_data['body'] = issue['body']

        if "pull_request" in issue and issue['pull_request'][
                'html_url'] is not None:
            new_issue['body'] = format_pull_request(template_data)
        else:
            new_issue['body'] = format_issue(template_data)

        issue_migration['issue'] = new_issue
        issue_migration['comments'] = comments

        issue_migrations.append(issue_migration)

    state.current = state.IMPORT_CONFIRMATION

    print("You are about to add to '" + config.get('target', 'repository') +
          "':")
    print(" *", len(issue_migrations), "new issues")
    print(" *", num_new_comments, "new comments")
    print(" *", len(new_milestones), "new milestones")
    print(" *", len(new_labels), "new labels")
    if not query.yes_no("Are you sure you wish to continue?"):
        sys.exit()

    state.current = state.IMPORTING

    for milestone in new_milestones:
        result_milestone = import_milestone(milestone)
        milestone['number'] = result_milestone['number']
        milestone['url'] = result_milestone['url']

    for label in new_labels:
        result_label = import_label(label)

    migration_results = []
    for issue_migration in issue_migrations:
        issue = issue_migration['issue']
        if 'milestone_object' in issue:
            issue['milestone'] = issue['milestone_object']['number']
            del issue['milestone_object']

        if 'label_objects' in issue:
            issue_labels = []
            for label in issue['label_objects']:
                issue_labels.append(label['name'])
            issue['labels'] = issue_labels
            del issue['label_objects']

        migration_result = send_request(
            'target', "import/issues", issue_migration, "POST",
            "application/vnd.github.golden-comet-preview+json")
        print("Sent import request. Status: '%s'. Status url: '%s'" %
              (migration_result['status'], migration_result['url']))

        migration_results.append(migration_result)

    state.current = state.IMPORT_COMPLETE

    # TODO wait for import requests to complete

    return issue_migrations