def process(args):
    conduit = phlsys_makeconduit.make_conduit()

    if args.act_as_user:
        conduit.set_act_as_user(args.act_as_user)

    d = {
        'message': args.message,
        'silent': args.silent,
        'action': phlcon_differential.USER_ACTIONS[args.action]
    }

    if args.message_file:
        d['message'] += args.message_file.read()

    ids = args.ids
    if args.ids_file:
        ids.extend([int(i) for i in args.ids_file.read().split()])

    if not ids:
        print "error: you have not specified any revision ids"
        sys.exit(1)

    for i in ids:
        d["revision_id"] = i
        result = conduit.call("differential.createcomment", d)
        print result
Ejemplo n.º 2
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert,
                                              args.act_as_user)

    if args.revision:
        result = phlcon_differential.get_revision_diff(conduit, args.revision)
    else:
        assert args.diff
        result = phlcon_differential.get_diff(conduit, args.diff)

    if args.format_python:
        pprint.pprint(result)
    elif args.format_json:
        print(json.dumps(result, sort_keys=True, indent=2))
    elif args.format_unified:
        print(unified_diff(result))
    elif args.format_files:
        phlcon_differential.write_diff_files(result, args.format_files)
    elif args.format_strings:
        fmt = args.format_strings[0]
        fmt_change = args.format_strings[1]
        if fmt:
            print(fmt.format(**result))
        if fmt_change:
            for change in result["changes"]:
                print(fmt_change.format(**change))
    else:  # args.list_files:
        paths = set()
        for change in result.changes:
            paths.add(change["currentPath"])
            paths.add(change["oldPath"])
        for path in paths:
            print(path)
Ejemplo n.º 3
0
def process(args):
    _validate_args(args)
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)
    me = conduit.get_user()

    d = _process_user_fields(me, conduit, args)
    _set_options(args, d)

    d["order"] = 'order-' + args.order

    # perform the query
    results = conduit("differential.query", d)

    if args.statuses:
        results = [r for r in results if r["statusName"] in args.statuses]

    if args.update_min_age or args.update_max_age:
        results = _exclude_on_update_age(args, results)

    if args.translate:
        # gather user PHIDs
        _translate_user_phids(conduit, results)

    _set_human_times(results)

    _output_results(args, results)
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)

    d = {'diff': args.infile.read()}

    result = conduit.call("differential.createrawdiff", d)
    print result["id"]
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    if args.revision:
        result = phlcon_differential.get_revision_diff(conduit, args.revision)
    else:
        assert args.diff
        result = phlcon_differential.get_diff(conduit, args.diff)

    if args.format_python:
        pprint.pprint(result)
    elif args.format_json:
        print json.dumps(result, sort_keys=True, indent=2)
    elif args.format_unified:
        print unified_diff(result)
    elif args.format_files:
        phlcon_differential.write_diff_files(result, args.format_files)
    elif args.format_strings:
        fmt = args.format_strings[0]
        fmt_change = args.format_strings[1]
        if fmt:
            print fmt.format(**result)
        if fmt_change:
            for change in result["changes"]:
                print fmt_change.format(**change)
    else:  # args.list_files:
        paths = set()
        for change in result.changes:
            paths.add(change["currentPath"])
            paths.add(change["oldPath"])
        for path in paths:
            print path
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)

    d = {}

    if args.revision:
        d["revision_id"] = args.revision
    if args.diff:
        d["diff_id"] = args.diff

    result = conduit.call("differential.getdiff", d)

    if args.format_python:
        pprint.pprint(result)
    elif args.format_json:
        print json.dumps(result, sort_keys=True, indent=2)
    elif args.format_unified:
        print unified_diff(result)
    elif args.format_strings:
        fmt = args.format_strings[0]
        fmt_change = args.format_strings[1]
        if fmt:
            print fmt.format(**result)
        if fmt_change:
            for change in result["changes"]:
                print fmt_change.format(**change)
    else:  # args.list_files:
        paths = set()
        for change in result["changes"]:
            paths.add(change["currentPath"])
            paths.add(change["oldPath"])
        for path in paths:
            print path
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    # create a new diff if we need to
    if args.diff_id:
        diff_id = args.diff_id
    else:
        d = {'diff': args.raw_diff_file.read()}
        diff_id = conduit("differential.createrawdiff", d)["id"]

    fields = {}

    d = {
        'id': args.revision_id,
        'diffid': diff_id,
        'fields': fields,
        'message': args.message
    }

    result = conduit("differential.updaterevision", d)

    if args.format_id:
        print result["revisionid"]
    elif args.format_url:
        print result["uri"]
    else:  # args.format_summary:
        print (
            "Updated revision '{rev_id}', you can view it at this URL:\n"
            "  {url}"
        ).format(
            rev_id=result["revisionid"],
            url=result["uri"])
Ejemplo n.º 8
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert,
                                              args.act_as_user)

    d = {'diff': args.infile.read()}

    result = conduit("differential.createrawdiff", d)
    print(result["id"])
Ejemplo n.º 9
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    # conduit expects PHIDs not plain usernames
    user_phids = phlcon_user.UserPhidCache(conduit)
    user_phids.add_hint_list(
        _combine_lists_if_not_none(args.owners, args.ccs))
    authors = [user_phids.get_phid(user) for user in args.authors]
    owners = [user_phids.get_phid(user) for user in args.owners]
    ccs = [user_phids.get_phid(user) for user in args.ccs]

    # conduit expects PHIDs not plain project names
    projects = None
    if args.projects:
        project_to_phid = phlcon_project.make_project_to_phid_dict(conduit)
        projects = [project_to_phid[p] for p in args.projects]

    filters = phlcon_maniphest.STATUS_FILTERS
    status = filters[args.status] if args.status is not None else None

    orderings = phlcon_maniphest.ORDERS
    order = orderings[args.order] if args.order is not None else None

    results = phlcon_maniphest.query(
        conduit,
        ids=args.ids,
        authors=authors,
        owners=owners,
        ccs=ccs,
        projects=projects,
        status=status,
        limit=args.max_results,
        offset=args.offset_results,
        order=order,
        text=args.text)

    results = [dict(r.__dict__) for r in results]

    for r in results:
        if r['statusName'] is None:
            r['statusName'] = phlcon_maniphest.STATUSES[int(r['status'])]

    # initialise to format for 'args.format_short'
    output_format = "{id} / {statusName} / {priority} / {title}"

    if args.format_ids:
        output_format = "{id}"
    elif args.format_string is not None:
        output_format = args.format_string

    if args.format_python:
        pprint.pprint(results)
    elif args.format_json:
        print(json.dumps(results, sort_keys=True, indent=2))
    else:
        for r in results:
            print(output_format.format(**r))
def process(args):
    if args.title and not args.title.strip():
        print('you must supply a non-empty title', file=sys.stderr)
        return 1

    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    # create_task expects an integer
    priority = None
    if args.priority is not None:
        priority = phlcon_maniphest.PRIORITIES[args.priority]

    # conduit expects PHIDs not plain usernames
    user_phids = phlcon_user.UserPhidCache(conduit)
    if args.owner:
        user_phids.add_hint(args.owner)
    if args.ccs:
        user_phids.add_hint_list(args.ccs)
    owner = user_phids.get_phid(args.owner) if args.owner else None
    ccs = [user_phids.get_phid(u) for u in args.ccs] if args.ccs else None

    # conduit expects PHIDs not plain project names
    projects = None
    if args.projects:
        project_to_phid = phlcon_project.make_project_to_phid_dict(conduit)
        projects = [project_to_phid[p] for p in args.projects]

    result = phlcon_maniphest.update_task(
        conduit,
        args.id,
        args.title,
        args.description,
        priority,
        owner,
        ccs,
        projects,
        args.comment,
        args.status)

    if args.format_id:
        print(result.id)
    elif args.format_url:
        print(result.uri)
    else:  # args.format_summary:
        message = (
            "Updated task '{task_id}', you can view it at this URL:\n"
            "  {url}"
        ).format(
            task_id=result.id,
            url=result.uri)
        print(message)
Ejemplo n.º 11
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert,
                                              args.act_as_user)

    message = args.message
    if args.message_file:
        message += args.message_file.read()

    result = phlcon_differential.create_inline_comment(
        conduit, args.id, args.filepath, args.start_line, message,
        not args.left_side, args.end_line_offset)

    print(result)
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    # create a new diff if we need to
    if args.diff_id:
        diff_id = args.diff_id
    else:
        d = {'diff': args.raw_diff_file.read()}
        diff_id = conduit("differential.createrawdiff", d)["id"]

    fields = {}

    d = {
        'id': args.revision_id,
        'diffid': diff_id,
        'fields': fields,
        'message': args.message
    }

    MessageFields = phlcon_differential.MessageFields

    args.ccs = _get_set_or_none(args.ccs)
    args.reviewers = _get_set_or_none(args.reviewers)

    if args.reviewers:
        fields[MessageFields.reviewer_phids] = args.reviewers
    if args.ccs:
        fields[MessageFields.cc_phids] = args.ccs

    # conduit expects PHIDs not plain usernames
    user_phids = phlcon_user.UserPhidCache(conduit)
    for users in fields.itervalues():
        user_phids.add_hint_list(users)
    for key in fields.iterkeys():
        fields[key] = [user_phids.get_phid(u) for u in fields[key]]

    result = conduit("differential.updaterevision", d)

    if args.format_id:
        print(result["revisionid"])
    elif args.format_url:
        print(result["uri"])
    else:  # args.format_summary:
        print((
            "Updated revision '{rev_id}', you can view it at this URL:\n"
            "  {url}"
        ).format(
            rev_id=result["revisionid"],
            url=result["uri"]))
    def __init__(self, conduitproxy_args, *args):

        # setup the long-running conduit for the proxy
        self.__conduitproxy_args = conduitproxy_args
        self.__conduit = phlsys_makeconduit.make_conduit(
            self.__conduitproxy_args.uri, self.__conduitproxy_args.user,
            self.__conduitproxy_args.cert)

        self.path = None  # for pychecker
        self.rfile = None  # for pychecker
        self.wfile = None  # for pychecker
        self.headers = None  # for pychecker

        BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args)
Ejemplo n.º 14
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    if args.text:
        text = args.text
    elif args.text_file:
        text = args.text_file.read()
    else:
        print "error: you have not specified any content for the paste"
        sys.exit(1)

    result = phlcon_paste.create_paste(
        conduit, text, args.title, args.language)
    print result.uri if not args.format_id else result.id
Ejemplo n.º 15
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert,
                                              args.act_as_user)

    if args.text:
        text = args.text
    elif args.text_file:
        text = args.text_file.read()
    else:
        print("error: you have not specified any content for the paste")
        sys.exit(1)

    result = phlcon_paste.create_paste(conduit, text, args.title,
                                       args.language)
    print(result.uri if not args.format_id else result.id)
Ejemplo n.º 16
0
    def __init__(self, conduitproxy_args, *args):

        # setup the long-running conduit for the proxy
        self.__conduitproxy_args = conduitproxy_args
        self.__conduit = phlsys_makeconduit.make_conduit(
            self.__conduitproxy_args.uri,
            self.__conduitproxy_args.user,
            self.__conduitproxy_args.cert)

        self.path = None  # for pychecker
        self.rfile = None  # for pychecker
        self.wfile = None  # for pychecker
        self.headers = None  # for pychecker

        BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args)
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    # create a new diff if we need to
    if args.diff_id:
        diff_id = args.diff_id
    else:
        d = {'diff': args.raw_diff_file.read()}
        diff_id = conduit("differential.createrawdiff", d)["id"]

    fields = {}

    MessageFields = phlcon_differential.MessageFields

    if args.reviewers:
        fields[MessageFields.reviewer_phids] = args.reviewers
    if args.ccs:
        fields[MessageFields.cc_phids] = args.ccs

    # conduit expects PHIDs not plain usernames
    user_phids = phlcon_user.UserPhidCache(conduit)
    for users in fields.itervalues():
        user_phids.add_hint_list(users)
    for key in fields.iterkeys():
        fields[key] = [user_phids.get_phid(u) for u in fields[key]]

    fields[MessageFields.title] = args.title
    fields[MessageFields.test_plan] = args.test_plan
    if args.summary:
        fields[MessageFields.summary] = args.summary

    d = {'diffid': diff_id, 'fields': fields}

    result = conduit("differential.createrevision", d)

    if args.format_id:
        print(result["revisionid"])
    elif args.format_url:
        print(result["uri"])
    else:  # args.format_summary:
        print((
            "Created a new revision '{rev_id}', you can view it at this URL:\n"
            "  {url}"
        ).format(
            rev_id=result["revisionid"],
            url=result["uri"]))
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)

    # create a new diff if we need to
    if args.diff_id:
        diff_id = args.diff_id
    else:
        d = {'diff': args.raw_diff_file.read()}
        diff_id = conduit.call("differential.createrawdiff", d)["id"]

    fields = {}

    MessageFields = phlcon_differential.MessageFields

    if args.reviewers:
        fields[MessageFields.reviewer_phids] = args.reviewers
    if args.ccs:
        fields[MessageFields.cc_phids] = args.ccs

    # conduit expects PHIDs not plain usernames
    user_phids = phlcon_user.UserPhidCache(conduit)
    for users in fields.itervalues():
        user_phids.add_hint_list(users)
    for key in fields.iterkeys():
        fields[key] = [user_phids.get_phid(u) for u in fields[key]]

    fields[MessageFields.title] = args.title
    fields[MessageFields.test_plan] = args.test_plan
    if args.summary:
        fields[MessageFields.summary] = args.summary

    d = {'diffid': diff_id, 'fields': fields}

    result = conduit.call("differential.createrevision", d)

    if args.format_id:
        print result["revisionid"]
    elif args.format_url:
        print result["uri"]
    else:  # args.format_summary:
        print (
            "Created a new revision '{rev_id}', you can view it at this URL:\n"
            "  {url}"
        ).format(
            rev_id=result["revisionid"],
            url=result["uri"])
Ejemplo n.º 19
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    message = args.message
    if args.message_file:
        message += args.message_file.read()

    result = phlcon_differential.create_inline_comment(
        conduit,
        args.id,
        args.filepath,
        args.start_line,
        message,
        not args.left_side,
        args.end_line_offset)

    print result
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert, args.act_as_user)

    d = {"message": args.message, "silent": args.silent, "action": phlcon_differential.USER_ACTIONS[args.action]}

    if args.message_file:
        d["message"] += args.message_file.read()

    ids = args.ids
    if args.ids_file:
        ids.extend([int(i) for i in args.ids_file.read().split()])

    if not ids:
        print "error: you have not specified any revision ids"
        sys.exit(1)

    for i in ids:
        d["revision_id"] = i
        result = conduit("differential.createcomment", d)
        print result
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)

    # create a new diff if we need to
    if args.diff_id:
        diff_id = args.diff_id
    else:
        d = {'diff': args.raw_diff_file.read()}
        diff_id = conduit.call("differential.createrawdiff", d)["id"]

    fields = {}

    d = {
        'id': args.revision_id,
        'diffid': diff_id,
        'fields': fields,
        'message': args.message
    }

    result = conduit.call("differential.updaterevision", d)
    print result["revisionid"]
Ejemplo n.º 22
0
def process(args):
    if args.title and not args.title.strip():
        print('you must supply a non-empty title', file=sys.stderr)
        return 1

    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert,
                                              args.act_as_user)

    # create_task expects an integer
    priority = None
    if args.priority is not None:
        priority = phlcon_maniphest.PRIORITIES[args.priority]

    # conduit expects PHIDs not plain usernames
    user_phids = phlcon_user.UserPhidCache(conduit)
    if args.owner:
        user_phids.add_hint(args.owner)
    if args.ccs:
        user_phids.add_hint_list(args.ccs)
    owner = user_phids.get_phid(args.owner) if args.owner else None
    ccs = [user_phids.get_phid(u) for u in args.ccs] if args.ccs else None

    # conduit expects PHIDs not plain project names
    projects = None
    if args.projects:
        project_to_phid = phlcon_project.make_project_to_phid_dict(conduit)
        projects = [project_to_phid[p] for p in args.projects]

    result = phlcon_maniphest.update_task(conduit, args.id, args.title,
                                          args.description, priority, owner,
                                          ccs, projects, args.comment)

    if args.format_id:
        print(result.id)
    elif args.format_url:
        print(result.uri)
    else:  # args.format_summary:
        message = ("Updated task '{task_id}', you can view it at this URL:\n"
                   "  {url}").format(task_id=result.id, url=result.uri)
        print(message)
Ejemplo n.º 23
0
def main():
    args = parse_args()
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)

    error_revisions = []

    novel_filter = NovelFileErrorFilter()

    error_filter = CompositeErrorFilter(
        BoringErrorFilter(),
        novel_filter)

    try:
        for revision in yield_revisions(conduit, args):

            linterate(args, conduit, revision, error_revisions, error_filter)

            # write new 'seen' errors after linterating, to give a chance for
            # the user to ctrl+c and prevent it being recorded
            #
            # it's pretty slow to write this out, we're doing it every time
            # that we've linted files we've downloaded from a webserver though,
            # so on balance it might not be so bad.
            novel_filter.write_seen()

    except phlsys_makeconduit.InsufficientInfoException as e:
        print("ERROR - insufficient information")
        print(e)
        print()
        print("N.B. you may also specify uri, user or cert directly like so:")
        print("  --uri URI           address of phabricator instance")
        print("  --user USERNAME     username of user to connect as")
        print("  --cert CERTIFICATE  certificate for user Phabrictor account")
        return 1

    if error_revisions:
        print('revisions with errors:', ' '.join(error_revisions))
    else:
        print('no revisions had errors')
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)

    # create a new diff if we need to
    if args.diff_id:
        diff_id = args.diff_id
    else:
        d = {'diff': args.raw_diff_file.read()}
        diff_id = conduit.call("differential.createrawdiff", d)["id"]

    fields = {}

    MessageFields = phlcon_differential.MessageFields

    if args.reviewers:
        fields[MessageFields.reviewer_phids] = args.reviewers
    if args.ccs:
        fields[MessageFields.cc_phids] = args.ccs

    # convert all the usernames to userPHIDs
    # TODO: extract function and share with 'query'
    users = [u for users in fields.itervalues() for u in users]
    users = list(set(users))
    userToPhid = {}
    if users:
        userToPhid = phlcon_user.make_username_phid_dict(conduit, users)
    for key in fields.iterkeys():
        fields[key] = [userToPhid[u] for u in fields[key]]

    fields[MessageFields.title] = args.title
    fields[MessageFields.test_plan] = args.test_plan
    if args.summary:
        d[MessageFields.summary] = args.summary

    d = {'diffid': diff_id, 'fields': fields}

    result = conduit.call("differential.createrevision", d)
    print result["revisionid"]
Ejemplo n.º 25
0
def main():
    args = parse_args()
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)

    error_revisions = []

    novel_filter = NovelFileErrorFilter()

    error_filter = CompositeErrorFilter(BoringErrorFilter(), novel_filter)

    try:
        for revision in yield_revisions(conduit, args):

            linterate(args, conduit, revision, error_revisions, error_filter)

            # write new 'seen' errors after linterating, to give a chance for
            # the user to ctrl+c and prevent it being recorded
            #
            # it's pretty slow to write this out, we're doing it every time
            # that we've linted files we've downloaded from a webserver though,
            # so on balance it might not be so bad.
            novel_filter.write_seen()

    except phlsys_makeconduit.InsufficientInfoException as e:
        print("ERROR - insufficient information")
        print(e)
        print()
        print("N.B. you may also specify uri, user or cert directly like so:")
        print("  --uri URI           address of phabricator instance")
        print("  --user USERNAME     username of user to connect as")
        print("  --cert CERTIFICATE  certificate for user Phabrictor account")
        return 1

    if error_revisions:
        print('revisions with errors:', ' '.join(error_revisions))
    else:
        print('no revisions had errors')
Ejemplo n.º 26
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(
        args.uri, args.user, args.cert, args.act_as_user)

    d = {
        'message': args.message,
        'silent': args.silent,
        'action': phlcon_differential.USER_ACTIONS[args.action],
        'attach_inlines': args.attach_inlines
    }

    if args.message_file:
        d['message'] += args.message_file.read()

    ids = args.ids
    if args.ids_file:
        ids.extend([int(i) for i in args.ids_file.read().split()])

    if not ids:
        print("error: you have not specified any revision ids")
        sys.exit(1)

    for i in ids:
        phlcon_differential.create_comment(conduit, i, **d)
Ejemplo n.º 27
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert,
                                              args.act_as_user)

    d = {
        'message': args.message,
        'silent': args.silent,
        'action': phlcon_differential.USER_ACTIONS[args.action],
        'attach_inlines': args.attach_inlines
    }

    if args.message_file:
        d['message'] += args.message_file.read()

    ids = args.ids
    if args.ids_file:
        ids.extend([int(i) for i in args.ids_file.read().split()])

    if not ids:
        print("error: you have not specified any revision ids")
        sys.exit(1)

    for i in ids:
        phlcon_differential.create_comment(conduit, i, **d)
Ejemplo n.º 28
0
def process(args):
    conduit = phlsys_makeconduit.make_conduit(args.uri, args.user, args.cert)
    me = conduit.get_user()

    d = {}

    def processUserField(name, param, add_me):
        d[name] = param
        if add_me:
            d[name].append(me)

    processUserField("authors", args.authors, args.author_me)
    processUserField("reviewers", args.reviewers, args.reviewer_me)
    processUserField("ccs", args.ccs, args.cc_me)
    processUserField("subscribers", args.subscribers, args.subscriber_me)
    processUserField(
        "responsibleUsers",
        args.responsible_users,
        args.responsible_me)

    users = [u for users in d.itervalues() for u in users]
    users = list(set(users))
    userToPhid = {}
    if users:
        userToPhid = phlcon_user.make_username_phid_dict(conduit, users)

    # XXX: check for duplicates in author and reviewer
    # XXX: check for bad userToPhid
    for key in d.iterkeys():
        d[key] = [userToPhid[u] for u in d[key]]

    if args.ids:
        d["ids"] = args.ids

    if args.ids_stdin:
        ids = [int(i) for i in " ".join(sys.stdin.readlines()).split()]
        d["ids"] = args.ids + ids

    if args.status_type:
        d["status"] = "status-" + args.status_type

    if args.arcanist_projects:
        d["arcanistProjects"] = args.arcanist_projects

    if args.max_results:
        d["limit"] = args.max_results

    if args.offset_results:
        d["offset"] = args.offset_results

    # perform the query
    results = conduit.call("differential.query", d)

    # apply filters

    if args.statuses:
        new_results = []
        for r in results:
            if r["statusName"] in args.statuses:
                new_results.append(r)
        results = new_results

    if args.update_min_age:
        now = datetime.datetime.now()
        new_results = []
        for r in results:
            modified = datetime.datetime.fromtimestamp(
                float(r["dateModified"]))
            age = now - modified
            if age >= args.update_min_age:
                new_results.append(r)
        results = new_results

    if args.update_max_age:
        now = datetime.datetime.now()
        new_results = []
        for r in results:
            modified = datetime.datetime.fromtimestamp(
                float(r["dateModified"]))
            age = now - modified
            if age <= args.update_max_age:
                new_results.append(r)
        results = new_results

    # apply transformations

    if args.translate:
        # gather user PHIDs
        user_phids = set()
        for r in results:
            user_phids.add(r["authorPHID"])
            for u in r["ccs"]:
                user_phids.add(u)
            for u in r["reviewers"]:
                user_phids.add(u)

        # get the names back
        phidToUser = {}
        user_phids = list(user_phids)
        if user_phids:
            phidToUser = phlcon_user.make_phid_username_dict(
                conduit, user_phids)

        # do the translation
        for r in results:
            r[u"authorUsername"] = phidToUser[r["authorPHID"]]
            r[u"ccUsernames"] = [phidToUser[u] for u in r["ccs"]]
            r[u"reviewerUsernames"] = [phidToUser[u] for u in r["reviewers"]]

    for r in results:
        r[u"humanTimeSinceDateModified"] = humanTimeSince(
            datetime.datetime.fromtimestamp(float(r["dateModified"])))
        r[u"humanTimeSinceDateCreated"] = humanTimeSince(
            datetime.datetime.fromtimestamp(float(r["dateCreated"])))

    # output results

    if not args.format_type and not args.format_string:
        args.format_type = "short"
    if args.format_type:
        if args.format_type == "json":
            print json.dumps(results, sort_keys=True, indent=2)
        elif args.format_type == "python":
            pprint.pprint(results)
        elif args.format_type == "short":
            shortTemplate = string.Template("$id / $statusName / $title")
            for x in results:
                print shortTemplate.safe_substitute(x)
        elif args.format_type == "ids":
            shortTemplate = string.Template("$id")
            for x in results:
                print shortTemplate.safe_substitute(x)
        else:
            raise Exception("unsupported format")
    else:
        template = string.Template(args.format_string)
        for x in results:
            print template.safe_substitute(x)