{"action":"created","comment":{"url":"https://api.github.com/repos/RackHD/on-build-config/pulls/comments/96351965","pull_request_review_id":16928845,"id":96351965,"diff_hunk":"@@ -0,0 +1,230 @@\n+#!/usr/bin/env python\n+# Copyright 2016, DELLEMC, Inc.\n+\n+\"\"\"\n+This is a command line program that makes a rackhd release to npmjs.\n+\n+Usage:\n+./on-build-config/build-release-tools/HWIMO-BUILD on-build-config/build-release-tools/application/release_npm_packages.py \\\n+--build-directory b/ \\\n+--manifest-file rackhd-devel \\\n+--git-credential https://github.com,GITHUB \\\n+--npm-credential registry.npmjs.org,6a2d8de2-dfce-4f59-a866-20f1baa394bd \\\n+--jobs 8 \\\n+--is-official-release true\\\n+--force \n+\n+The required parameters:\n+build-directory: A directory where all the repositories are cloned to. \n+manifest-file: The path of manifest file. \n+npm-credential: NPM registry url and token for ci service: <URL>,<Token>\n+\n+The optional parameters:\n+git-credential: Git URL and credential for CI services: <URL>,<Credentials>\n+is-official-release: Whether this release is official. The default value is False\n+force: Use destination directory, even if it exists.\n+jobs: Number of parallel jobs(build debian packages) to run.\n+      The number is related to the compute architecture, multi-core processors..\n+\"\"\"\n+\n+import argparse\n+import os\n+import sys\n+import json\n+\n+try:\n+    from reprove import ManifestActions\n+    from version_generator import VersionGenerator\n+    from npm import NPM\n+    import common\n+except ImportError as import_err:\n+    print import_err\n+    sys.exit(1)\n+\n+def parse_args(args):\n+    \"\"\"\n+    Parse script arguments.\n+    :return: Parsed args for assignment\n+    \"\"\"\n+    parser = argparse.ArgumentParser()\n+    parser.add_argument('--build-directory',\n+                        required=True,\n+                        help=\"Top level directory that stores all the cloned repositories.\",\n+                        action='store')\n+\n+    parser.add_argument('--manifest-file',\n+                        required=True,\n+                        help=\"The file path of manifest\",\n+                        action='store')\n+\n+    parser.add_argument('--git-credential',\n+                        help=\"Git URL and credential for CI services: <URL>,<Credentials>\",\n+                        action='append',\n+                        default=None)\n+\n+    parser.add_argument('--npm-credential',\n+                        required=True,\n+                        help=\"NPM URL and credential for CI services: <URL>,<Token>\",\n+                        action='store')\n+\n+    parser.add_argument('--jobs',\n+                        help=\"Number of build jobs to run in parallel\",\n+                        default=-1,\n+                        type=int,\n+                        action=\"store\")\n+\n+    parser.add_argument('--is-official-release',\n+                        default=\"false\",\n+                        help=\"Whether this release is official\",\n+                        action=\"store\")\n+\n+    parser.add_argument('--force',\n+                        help=\"Overwrite a directory even if it exists\",\n+                        action=\"store_true\")\n+\n+    parsed_args = parser.parse_args(args)\n+    parsed_args.is_official_release = common.str2bool(parsed_args.is_official_release)\n+    return parsed_args\n+\n+def get_npm_packages(build_dir):\n+    '''\n+    Find all the packages which contains package.json under the directory specified by the parameter build_dir\n+    '''\n+    packages = []\n+    for dirname in os.listdir(build_dir):\n+        repo_dir = os.path.join(build_dir,dirname)\n+        if os.path.isdir(repo_dir):\n+            for filename in os.listdir(repo_dir):\n+                if filename == \"package.json\":\n+                    packages.append(dirname)\n+    return packages\n+\n+def compute_packages_version(build_dir, is_official_release):\n+    '''\n+    compute the version of packages under the build_dir\n+    return: a dict like: {\"pacakge name\": \"version\"}\n+    '''\n+    version_dict = {}\n+    try:\n+        npm_packages = get_npm_packages(build_dir)\n+        for package in npm_packages:\n+            package_dir = os.path.join(build_dir, package)\n+            version_generator = VersionGenerator(package_dir)\n+            version = version_generator.generate_package_version(is_official_release, version_type=\"npm\")\n+            if version != None:\n+                version_dict[package] = version\n+            else:\n+                raise RuntimeError(\"Failed to compute version of {package} due to version is None\".format(package=package_dir))\n+        return version_dict\n+\n+    except Exception, e:\n+        raise RuntimeError(\"Failed to compute version for packages under {0} \\ndue to {1}\".format(build_dir, e))\n+    \n+def update_packages_version(build_dir, version_dict):\n+    \"\"\"\n+    Update the package.json with the version\n+    :param build_dir: The directory of rackhd repository\n+    :param version_dict: a dict contains package name and version\n+    \"\"\"\n+    try:\n+        for key, value in version_dict.iteritems():\n+            package_dir = os.path.join(build_dir, key)\n+            print \"starting to update version of {0} to {1}\".format(package_dir, value)\n+            NPM.update_version(package_dir, version=value)\n+    except Exception, e:\n+        raise RuntimeError(\"Failed to update version for package under {0} \\ndue to {1}\".format(build_dir, e))\n+\n+def update_packages_dependency(build_dir, version_dict):\n+    \"\"\"\n+    Update the dependency of package.json.\n+    For example:\n+    - \"on-core\": \"git+https://github.com/RackHD/on-core.git\",\n+    + \"on-core\": \"1.0.0\",\n+    \"\"\"\n+    try:\n+        for key, value in version_dict.items():\n+            package_dir = os.path.join(build_dir, key)\n+            print \"starting to update the dependency of {0}\".format(package_dir)\n+            update_dependency(package_dir, version_dict)\n+    except Exception, e:\n+        raise RuntimeError(\"Failed to update dependency for package under {0} \\ndue to {1}\".format(build_dir, e))\n+\n+\n+def update_dependency(package_dir, version_dict):\n+    package_json_file = os.path.join(package_dir, \"package.json\")\n+    if not os.path.exists(package_json_file):\n+        # If there's no package.json file, there is nothing more for us to do here\n+        return\n+\n+    changes = False\n+    log = \"\"\n+    with open(package_json_file, \"r\") as fp:\n+        package_data = json.load(fp)\n+        if \"dependencies\" in package_data:\n+            for package, version in package_data[\"dependencies\"].items():\n+                new_version = None\n+                if package in version_dict:\n+                    new_version = version_dict[package]\n+                if new_version is not None and version != new_version:\n+                    package_data[\"dependencies\"][package] = new_version\n+                    changes = True\n+                    log += \"  {0}:\\n    WAS {1}\\n    NOW {2}\\n\".format(package,version,new_version)\n+\n+    if changes:\n+        print \"There are changes to dependencies for {0}\\n{1}\".format(package_json_file, log)\n+        os.remove(package_json_file)\n+        new_file = package_json_file\n+        with open(new_file, \"w\") as newfile:\n+            json.dump(package_data, newfile, indent=4, sort_keys=True)\n+    else:\n+        print \"There are NO changes to data for {0}\".format(package_json_file)\n+\n+def publish_packages(build_dir, is_official_release, npm_registry, npm_token):\n+    \"\"\"\n+    Publish all the npm packages under directory specified by build_dir\n+    \"\"\"\n+    npm_packages = get_npm_packages(build_dir)\n+    # Skip the release of di.js\n+    npm_packages.remove(\"di.js\")\n+    for package in npm_packages:\n+        try:\n+            package_dir = os.path.join(build_dir, package)\n+            npm = NPM(npm_registry, npm_token)\n+            print \"starting to publish npm package {0}\".format(package)\n+            if is_official_release:\n+                npm.publish_package(package_dir)\n+            else:\n+                npm.publish_package(package_dir, tag=\"ci-release\")","path":"build-release-tools/application/release_npm_packages.py","position":197,"original_position":197,"commit_id":"1559b2fc6863301ffb28f8cf0baba51b1774831a","original_commit_id":"1559b2fc6863301ffb28f8cf0baba51b1774831a","user":{"login":"panpan0000","id":14049268,"avatar_url":"https://avatars.githubusercontent.com/u/14049268?v=3","gravatar_id":"","url":"https://api.github.com/users/panpan0000","html_url":"https://github.com/panpan0000","followers_url":"https://api.github.com/users/panpan0000/followers","following_url":"https://api.github.com/users/panpan0000/following{/other_user}","gists_url":"https://api.github.com/users/panpan0000/gists{/gist_id}","starred_url":"https://api.github.com/users/panpan0000/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/panpan0000/subscriptions","organizations_url":"https://api.github.com/users/panpan0000/orgs","repos_url":"https://api.github.com/users/panpan0000/repos","events_url":"https://api.github.com/users/panpan0000/events{/privacy}","received_events_url":"https://api.github.com/users/panpan0000/received_events","type":"User","site_admin":false},"body":"what does the \"tag\" means?\r\ncan you show us where the tag is in npm registry ?","created_at":"2017-01-17T06:46:51Z","updated_at":"2017-01-17T06:59:05Z","html_url":"https://github.com/RackHD/on-build-config/pull/54#discussion_r96351965","pull_request_url":"https://api.github.com/repos/RackHD/on-build-config/pulls/54","_links":{"self":{"href":"https://api.github.com/repos/RackHD/on-build-config/pulls/comments/96351965"},"html":{"href":"https://github.com/RackHD/on-build-config/pull/54#discussion_r96351965"},"pull_request":{"href":"https://api.github.com/repos/RackHD/on-build-config/pulls/54"}}},"pull_request":{"url":"https://api.github.com/repos/RackHD/on-build-config/pulls/54","id":100243955,"html_url":"https://github.com/RackHD/on-build-config/pull/54","diff_url":"https://github.com/RackHD/on-build-config/pull/54.diff","patch_url":"https://github.com/RackHD/on-build-config/pull/54.patch","issue_url":"https://api.github.com/repos/RackHD/on-build-config/issues/54","number":54,"state":"open","locked":false,"title":"publish npm packages to npmjs","user":{"login":"PengTian0","id":19203416,"avatar_url":"https://avatars.githubusercontent.com/u/19203416?v=3","gravatar_id":"","url":"https://api.github.com/users/PengTian0","html_url":"https://github.com/PengTian0","followers_url":"https://api.github.com/users/PengTian0/followers","following_url":"https://api.github.com/users/PengTian0/following{/other_user}","gists_url":"https://api.github.com/users/PengTian0/gists{/gist_id}","starred_url":"https://api.github.com/users/PengTian0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PengTian0/subscriptions","organizations_url":"https://api.github.com/users/PengTian0/orgs","repos_url":"https://api.github.com/users/PengTian0/repos","events_url":"https://api.github.com/users/PengTian0/events{/privacy}","received_events_url":"https://api.github.com/users/PengTian0/received_events","type":"User","site_admin":false},"body":"The PR implements 2 functions:\r\n\r\n- Generate the version of the npm packages to be published.\r\n- Publish to npm package to registry of npm.\r\n\r\nThe PR depends on #53 \r\n\r\n**Test**:\r\nhttp://rackhdci.lss.emc.com/job/Experimental-Jobs/job/Release_NPM\r\n","created_at":"2017-01-05T07:13:26Z","updated_at":"2017-01-17T06:59:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1c10b5945472db78092da44e92591e07f2c96194","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/RackHD/on-build-config/pulls/54/commits","review_comments_url":"https://api.github.com/repos/RackHD/on-build-config/pulls/54/comments","review_comment_url":"https://api.github.com/repos/RackHD/on-build-config/pulls/comments{/number}","comments_url":"https://api.github.com/repos/RackHD/on-build-config/issues/54/comments","statuses_url":"https://api.github.com/repos/RackHD/on-build-config/statuses/1559b2fc6863301ffb28f8cf0baba51b1774831a","head":{"label":"PengTian0:feature/publish_npm_packages","ref":"feature/publish_npm_packages","sha":"1559b2fc6863301ffb28f8cf0baba51b1774831a","user":{"login":"PengTian0","id":19203416,"avatar_url":"https://avatars.githubusercontent.com/u/19203416?v=3","gravatar_id":"","url":"https://api.github.com/users/PengTian0","html_url":"https://github.com/PengTian0","followers_url":"https://api.github.com/users/PengTian0/followers","following_url":"https://api.github.com/users/PengTian0/following{/other_user}","gists_url":"https://api.github.com/users/PengTian0/gists{/gist_id}","starred_url":"https://api.github.com/users/PengTian0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PengTian0/subscriptions","organizations_url":"https://api.github.com/users/PengTian0/orgs","repos_url":"https://api.github.com/users/PengTian0/repos","events_url":"https://api.github.com/users/PengTian0/events{/privacy}","received_events_url":"https://api.github.com/users/PengTian0/received_events","type":"User","site_admin":false},"repo":{"id":67005800,"name":"on-build-config","full_name":"PengTian0/on-build-config","owner":{"login":"PengTian0","id":19203416,"avatar_url":"https://avatars.githubusercontent.com/u/19203416?v=3","gravatar_id":"","url":"https://api.github.com/users/PengTian0","html_url":"https://github.com/PengTian0","followers_url":"https://api.github.com/users/PengTian0/followers","following_url":"https://api.github.com/users/PengTian0/following{/other_user}","gists_url":"https://api.github.com/users/PengTian0/gists{/gist_id}","starred_url":"https://api.github.com/users/PengTian0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PengTian0/subscriptions","organizations_url":"https://api.github.com/users/PengTian0/orgs","repos_url":"https://api.github.com/users/PengTian0/repos","events_url":"https://api.github.com/users/PengTian0/events{/privacy}","received_events_url":"https://api.github.com/users/PengTian0/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/PengTian0/on-build-config","description":"Continuous Integration build tools","fork":true,"url":"https://api.github.com/repos/PengTian0/on-build-config","forks_url":"https://api.github.com/repos/PengTian0/on-build-config/forks","keys_url":"https://api.github.com/repos/PengTian0/on-build-config/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PengTian0/on-build-config/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PengTian0/on-build-config/teams","hooks_url":"https://api.github.com/repos/PengTian0/on-build-config/hooks","issue_events_url":"https://api.github.com/repos/PengTian0/on-build-config/issues/events{/number}","events_url":"https://api.github.com/repos/PengTian0/on-build-config/events","assignees_url":"https://api.github.com/repos/PengTian0/on-build-config/assignees{/user}","branches_url":"https://api.github.com/repos/PengTian0/on-build-config/branches{/branch}","tags_url":"https://api.github.com/repos/PengTian0/on-build-config/tags","blobs_url":"https://api.github.com/repos/PengTian0/on-build-config/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PengTian0/on-build-config/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PengTian0/on-build-config/git/refs{/sha}","trees_url":"https://api.github.com/repos/PengTian0/on-build-config/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PengTian0/on-build-config/statuses/{sha}","languages_url":"https://api.github.com/repos/PengTian0/on-build-config/languages","stargazers_url":"https://api.github.com/repos/PengTian0/on-build-config/stargazers","contributors_url":"https://api.github.com/repos/PengTian0/on-build-config/contributors","subscribers_url":"https://api.github.com/repos/PengTian0/on-build-config/subscribers","subscription_url":"https://api.github.com/repos/PengTian0/on-build-config/subscription","commits_url":"https://api.github.com/repos/PengTian0/on-build-config/commits{/sha}","git_commits_url":"https://api.github.com/repos/PengTian0/on-build-config/git/commits{/sha}","comments_url":"https://api.github.com/repos/PengTian0/on-build-config/comments{/number}","issue_comment_url":"https://api.github.com/repos/PengTian0/on-build-config/issues/comments{/number}","contents_url":"https://api.github.com/repos/PengTian0/on-build-config/contents/{+path}","compare_url":"https://api.github.com/repos/PengTian0/on-build-config/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PengTian0/on-build-config/merges","archive_url":"https://api.github.com/repos/PengTian0/on-build-config/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PengTian0/on-build-config/downloads","issues_url":"https://api.github.com/repos/PengTian0/on-build-config/issues{/number}","pulls_url":"https://api.github.com/repos/PengTian0/on-build-config/pulls{/number}","milestones_url":"https://api.github.com/repos/PengTian0/on-build-config/milestones{/number}","notifications_url":"https://api.github.com/repos/PengTian0/on-build-config/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PengTian0/on-build-config/labels{/name}","releases_url":"https://api.github.com/repos/PengTian0/on-build-config/releases{/id}","deployments_url":"https://api.github.com/repos/PengTian0/on-build-config/deployments","created_at":"2016-08-31T05:20:26Z","updated_at":"2016-12-28T06:58:56Z","pushed_at":"2017-01-17T05:28:27Z","git_url":"git://github.com/PengTian0/on-build-config.git","ssh_url":"git@github.com:PengTian0/on-build-config.git","clone_url":"https://github.com/PengTian0/on-build-config.git","svn_url":"https://github.com/PengTian0/on-build-config","homepage":"","size":193,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"RackHD:master","ref":"master","sha":"39a0dc56e56837b6a1fb19ee73efad0e1970c9f2","user":{"login":"RackHD","id":13982662,"avatar_url":"https://avatars.githubusercontent.com/u/13982662?v=3","gravatar_id":"","url":"https://api.github.com/users/RackHD","html_url":"https://github.com/RackHD","followers_url":"https://api.github.com/users/RackHD/followers","following_url":"https://api.github.com/users/RackHD/following{/other_user}","gists_url":"https://api.github.com/users/RackHD/gists{/gist_id}","starred_url":"https://api.github.com/users/RackHD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RackHD/subscriptions","organizations_url":"https://api.github.com/users/RackHD/orgs","repos_url":"https://api.github.com/users/RackHD/repos","events_url":"https://api.github.com/users/RackHD/events{/privacy}","received_events_url":"https://api.github.com/users/RackHD/received_events","type":"Organization","site_admin":false},"repo":{"id":52533676,"name":"on-build-config","full_name":"RackHD/on-build-config","owner":{"login":"RackHD","id":13982662,"avatar_url":"https://avatars.githubusercontent.com/u/13982662?v=3","gravatar_id":"","url":"https://api.github.com/users/RackHD","html_url":"https://github.com/RackHD","followers_url":"https://api.github.com/users/RackHD/followers","following_url":"https://api.github.com/users/RackHD/following{/other_user}","gists_url":"https://api.github.com/users/RackHD/gists{/gist_id}","starred_url":"https://api.github.com/users/RackHD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RackHD/subscriptions","organizations_url":"https://api.github.com/users/RackHD/orgs","repos_url":"https://api.github.com/users/RackHD/repos","events_url":"https://api.github.com/users/RackHD/events{/privacy}","received_events_url":"https://api.github.com/users/RackHD/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/RackHD/on-build-config","description":"Continuous Integration build tools","fork":true,"url":"https://api.github.com/repos/RackHD/on-build-config","forks_url":"https://api.github.com/repos/RackHD/on-build-config/forks","keys_url":"https://api.github.com/repos/RackHD/on-build-config/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RackHD/on-build-config/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RackHD/on-build-config/teams","hooks_url":"https://api.github.com/repos/RackHD/on-build-config/hooks","issue_events_url":"https://api.github.com/repos/RackHD/on-build-config/issues/events{/number}","events_url":"https://api.github.com/repos/RackHD/on-build-config/events","assignees_url":"https://api.github.com/repos/RackHD/on-build-config/assignees{/user}","branches_url":"https://api.github.com/repos/RackHD/on-build-config/branches{/branch}","tags_url":"https://api.github.com/repos/RackHD/on-build-config/tags","blobs_url":"https://api.github.com/repos/RackHD/on-build-config/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RackHD/on-build-config/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RackHD/on-build-config/git/refs{/sha}","trees_url":"https://api.github.com/repos/RackHD/on-build-config/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RackHD/on-build-config/statuses/{sha}","languages_url":"https://api.github.com/repos/RackHD/on-build-config/languages","stargazers_url":"https://api.github.com/repos/RackHD/on-build-config/stargazers","contributors_url":"https://api.github.com/repos/RackHD/on-build-config/contributors","subscribers_url":"https://api.github.com/repos/RackHD/on-build-config/subscribers","subscription_url":"https://api.github.com/repos/RackHD/on-build-config/subscription","commits_url":"https://api.github.com/repos/RackHD/on-build-config/commits{/sha}","git_commits_url":"https://api.github.com/repos/RackHD/on-build-config/git/commits{/sha}","comments_url":"https://api.github.com/repos/RackHD/on-build-config/comments{/number}","issue_comment_url":"https://api.github.com/repos/RackHD/on-build-config/issues/comments{/number}","contents_url":"https://api.github.com/repos/RackHD/on-build-config/contents/{+path}","compare_url":"https://api.github.com/repos/RackHD/on-build-config/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RackHD/on-build-config/merges","archive_url":"https://api.github.com/repos/RackHD/on-build-config/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RackHD/on-build-config/downloads","issues_url":"https://api.github.com/repos/RackHD/on-build-config/issues{/number}","pulls_url":"https://api.github.com/repos/RackHD/on-build-config/pulls{/number}","milestones_url":"https://api.github.com/repos/RackHD/on-build-config/milestones{/number}","notifications_url":"https://api.github.com/repos/RackHD/on-build-config/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RackHD/on-build-config/labels{/name}","releases_url":"https://api.github.com/repos/RackHD/on-build-config/releases{/id}","deployments_url":"https://api.github.com/repos/RackHD/on-build-config/deployments","created_at":"2016-02-25T15:03:49Z","updated_at":"2016-12-28T06:20:39Z","pushed_at":"2017-01-17T06:33:21Z","git_url":"git://github.com/RackHD/on-build-config.git","ssh_url":"git@github.com:RackHD/on-build-config.git","clone_url":"https://github.com/RackHD/on-build-config.git","svn_url":"https://github.com/RackHD/on-build-config","homepage":"","size":177,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":4,"forks":14,"open_issues":4,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RackHD/on-build-config/pulls/54"},"html":{"href":"https://github.com/RackHD/on-build-config/pull/54"},"issue":{"href":"https://api.github.com/repos/RackHD/on-build-config/issues/54"},"comments":{"href":"https://api.github.com/repos/RackHD/on-build-config/issues/54/comments"},"review_comments":{"href":"https://api.github.com/repos/RackHD/on-build-config/pulls/54/comments"},"review_comment":{"href":"https://api.github.com/repos/RackHD/on-build-config/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/RackHD/on-build-config/pulls/54/commits"},"statuses":{"href":"https://api.github.com/repos/RackHD/on-build-config/statuses/1559b2fc6863301ffb28f8cf0baba51b1774831a"}}}}
{"actor":{"display_login":"panpan0000"}}