{"action":"created","comment":{"url":"https://api.github.com/repos/tsmith512/blog-posts/pulls/comments/57804822","id":57804822,"diff_hunk":"@@ -0,0 +1,228 @@\n+# Aquifer and Build Systems\n+\n+## What is a build system?\n+\n+Build systems simplify the development process by leveraging a single tool to\n+handle dependency management, automate tasks like testing, consolidate steps\n+to compile/deploy the product, and [????].\n+\n+Using a build system often leads to using an organized directory and file\n+structure which can be reused across projects, reinforcing best practices,\n+simplifying the process to ramp up new teammates, and making maintainable\n+choices [_(StackOverflow by haylem)_][BBTSO].\n+\n+While build systems have been in use in software projects for decades, they're\n+newer for web projects. Web development used to be serving static assets (HTML,\n+CSS, JS, and images). From there, the industry started having the server execute\n+pieces of the source files to adjust the output dynamically (SHTML, Perl, or\n+PHP) to do things like add modification dates, include reusable snippets, etc.\n+But over the years, this \"dynamic content\" gave rise to full CMS-based websites.\n+The change may have happened gradually, but these really are full applications\n+now. They should be managed as such, especially enterprise sites or sites with\n+large/revolving development teams.\n+\n+## We use Aquifer as a build system for Drupal.\n+\n+> Aquifer is a command line interface that makes it easy to scaffold, build,\n+> test, and deploy your Drupal websites. It provides a default set of tools that\n+> allow you to develop, and build Drupal sites using the Drush-make workflow. In\n+> addition, Aquifer ships with an extensions system that allows you to add\n+> additional tools to your project.\n+> \n+> - [Aquifer.io][AQ]\n+\n+At Four Kitchens, we saw several pain points in developing and maintain large\n+Drupal sites which boiled down to not having a build system, particularly around\n+ramping up new developers on projects quickly. We wanted to streamline this\n+process, but discovered that in the Drupal world, there are few boilerplates or\n+shell scripts that supported a [Drush make][DM] workflow. None were\n+cross-compatible. So [Patrick Coffey][PCGH] started the [Aquifer][AQ] project,\n+supported by [many other Web Chefs][AQC].\n+\n+Aquifer is now running on all Drupal 7 and Drupal 8 new builds at Four Kitchens,\n+supporting dozens on Web Chefs, contractors, and client-side developers.\n+\n+## Business Value\n+\n+On my current project, I'm the Product Owner. This means that in addition to\n+managing requirements, being the client's advocate, and planning releases, I am\n+also the steward of the client's money. Anything that can be made \"easier\" or\n+\"faster\" equates to more functionality for the money spent, and fewer billables\n+overall.\n+\n+Aside from the technical benefits below, having a build system generally, and\n+using Aquifer specifically, has benefited this and other projects around Four\n+Kitchens in the following ways:\n+\n+- Fewer manual steps for creating or updating a development instance allows\n+  teammembers to onboard faster and helps them switch between branches without\n+  regressions.\n+- Consistent code quality makes code reviews easier with a higher rate of\n+  acceptance on the first pass.\n+- Eliminating core and contrib code makes code reviews faster and highlights\n+  patched code for extra scrutiny if that is a necessity.\n+- Each of the following pain-points grows as the project gets older or bigger,\n+  challenging a site's overall maintainability.\n+\n+## Drupal Development Pain Points Solved\n+\n+### Core and Contrib Code in the Repo\n+\n+**Old way:** Using [git][GIT] or another distributed source control system\n+[is essential][SRG], but most Drupal sites are constructed by including Drupal's\n+core and all contributed modules and themes in the repository. This makes a huge\n+repo full of code you didn't write and aren't responsible for. Then you have to\n+sort through that when you review PRs.\n+\n+**New way:** Build systems would call core and contrib \"dependencies.\" A build\n+system fetches dependencies as needed. Aquifer leverages [Drush Make][DM] to\n+download the specified versions of core and contrib modules on each `build`.\n+This keeps your repo lean, free of code outside your project.\n+\n+### Managing Updates\n+\n+**Old way:** Use Drush (or download) updates to modules and/or core as needed,\n+then commit it all as a giant changeset (or, if you're crazy like me, spend more\n+time spliting it up).\n+\n+**New way:** Adjust the `drush.make` file as needed with the newest or preferred\n+version of the module you're using; then `build` and deploy. This makes changes\n+very visible, yet also quite simple:\n+\n+- You can `git blame` the `drush.make` file to figure out exactly when which\n+  components were updated and by whom.\n+- Sometimes you don't want to update a module unless it's a security release. In\n+  the \"old way,\" you'd either need to remember to reset that module's directory\n+  pre-commit or fiddle with locking the module version in the Update config.\n+  This way, update what you want and don't update what you don't want to.\n+\n+Fear not, the Drupal Update module will still offer notifications as usual.\n+\n+### Managing Patches\n+\n+In the course of Drupal development, you will likely one day need to alter a\n+contrib or core file. Doing so in an organized and responsible way is the key to\n+maintainability (aka \"not breaking your site\").\n+\n+**Old way:** Get the patch from D.o, apply it _and_ add the patch to the repo\n+(preferably in a separate directory so it isn't wiped out in an update), and\n+commit it all. Then, if the patched component is ever updated, make sure you\n+didn't lose track of the patch, apply it again (hoping it applies cleanly), and\n+commit. If you're not using a patch from D.o but instead writing code yourself,\n+you need to make sure you're making patches and applying them this way! There is\n+no system in place to ensure developers actually do this but code reviews.\n+\n+**New way:** You cannot directly edit core or contrib code, because it will be\n+downloaded anew on each `build`. Instead, Aquifer will apply all patches in the\n+patches directory during build. This way you will:\n+\n+- Never have confusion about whether a patch was applied or not.\n+- Never have any untracked modification of a contrib or core file which would be\n+  wiped out in an update.\n+- Be notified easily if a patch doesn't apply following an update.\n+- Everyone on the team can easily see what has been patched and how.\n+\n+### The Refresh: Avoiding Database Config, Keeping Database Sync'd to Code\n+\n+We all know not to do development or site building work on production. But\n+Drupal's database does hold overrides that can occasionally sneak in. If your\n+local database doesn't match the code you've checked out, you may not see bugs\n+or regressions until they clash with config in production. Also, there's no way\n+to review those overrides in a disciplined way.\n+\n+**Old way:** Check out the code you're working on. Copy down the Production\n+database or a backup. Run something like `drush features-revert-all` (`fra`) and\n+`drush cache-clear all` (`cc all`) multiple times, then an `updb` and assume all\n+overrides are cleared, all changes in the code have been applied, and any new\n+update hooks have executed. Then, unless you're using the [Master module][MM],\n+enable things like `fields_ui`, `views_ui`, `devel` and disable anything that is\n+production-specific.\n+\n+**New way:** Check out the code you're working on. Copy down the Production\n+database or a backup. Run `aquifer refresh`. Get to work with confidence that\n+your instance is up to date with your code.\n+\n+Refresh can be customized for your project, but we usually have refresh run\n+these steps in order:\n+\n+- Rebuild registry (refreshes Drupal's autoloader cache, `drush rr`)\n+- Set the Master module scope to local (enable all the dev modules)\n+- Clear all caches\n+- Execute the Master scope change\n+- Run all update hooks\n+- Revert all features\n+- Execute a final cache clear all.\n+\n+### Code Quality and Automated Testing\n+\n+**Old way:** Install and separately execute additional toolchains for code\n+linting and automated testing.\n+\n+**New way:** [Aquifer Coder][AQCDR] can run lint all PHP and JavaScript in your\n+repo (which is only your own code) with `aquifer lint` to ensure adherence to\n+Drupal coding style and standards for better consistency and code sharing.\n+\n+Additionally, use [Aquifer Run][AQR] to execute post-build commands to prepare\n+your frontend assets, execute tests, or any other repetitive tasks. In the\n+future, there will be dedicated Aquifer extensions for different testing\n+frameworks or frontend toolchains, but using Run in the meantime reduces the\n+number of manual steps.\n+\n+## Using Aquifer for Your Projects\n+\n+### How do I get started?\n+\n+Check out the [Aquifer Quick-start Guide][AQQSG]. A few hints I'll add:\n+\n+- We strongly recommend using [nvm][NVM] to manage your [Node.js][NJS] and\n+  module versions. Installing Node from Ubuntu or Homebrew packages leads to\n+  lots of outdated code and permissions issues, which snowball.\n+- Never use `sudo` for anything in this process. Aquifer uses NPM modules to\n+  download its extensions and prepare files to be executed by your web server,\n+  which may in turn save cached files in some directories. If some part of this\n+  process is executed with `sudo`, soon you'll have a mess of files owned by\n+  root, pushing you to use `sudo` more, all executing code from the Internet\n+  with elevated privileges, which is a major security risk. Web Chef Matt Grill\n+  wrote [NPM Doctor][NPMD] to help get yourself out of that spiral.\n+\n+### Can I use it on a project which already exists?\n+\n+Yes! Aquifer uses a Drush Make workflow, so what you need is a makefile. Drush\n+can generate this for you:\n+\n+1. In an existing Drupal site, execute `drush make-generate drupal.make`\n+2. [Create a new Aquifer project][AQQSG].\n+3. Copy in that makefile.\n+4. At this point, you'll need to bring in your custom code into the\n+   [Aquifer directory structure][AQDS]\n+5. From there, `aquifer build` should generate a `build` directory that looks\n+   just like your existing docroot. After testing it thoroughly, you can use\n+   [Aquifer Git][AQG] to deploy your project to the existing repo for\n+   deployment.\n+\n+## TL;DR:\n+\n+Using a build system streamlines the development process, particularly across\n+multiple developers working on a single project. By reducing errors in\n+repetitive steps, keeping the code repository lean and well organized,\n+[enabling a one-step build][JTBC], ensuring high code quality, and providing a\n+way to prevent database conflicts with the code, [Aquifer][AQ] has become a\n+demonstrably valuable part of the Four Kitchens development process.\n+\n+[BBTSO]: http://programmers.stackexchange.com/a/137528\n+[AQ]: http://aquifer.io/\n+[AQC]: https://github.com/aquifer/aquifer/graphs/contributors\n+[GIT]: https://git-scm.com/\n+[SRG]: http://sixrevisions.com/web-development/easy-git-tutorial/\n+[DM]: http://www.drush.org/en/master/make/\n+[MM]: https://www.drupal.org/project/master\n+[PCGH]: https://github.com/patrickocoffeyo\n+[AQCDR]: https://github.com/aquifer/aquifer-coder\n+[AQR]: https://github.com/aquifer/aquifer-run\n+[AQQSG]: http://docs.aquifer.io/sections/quickstart-guide.html\n+[NVM]: https://github.com/creationix/nvm\n+[NJS]: https://nodejs.org/\n+[NPMD]: https://github.com/mattgrill/NPM-Doctor\n+[AQDS]: http://docs.aquifer.io/sections/directory-structure.html\n+[AQG]: https://github.com/aquifer/aquifer-git\n+[JTBC]: http://www.joelonsoftware.com/articles/fog0000000043.html","path":"2013-03-aquifer-and-build-systems/README.md","position":228,"original_position":228,"commit_id":"17045a4bc4c0940c87529ac07f21ce39b9c3490c","original_commit_id":"17045a4bc4c0940c87529ac07f21ce39b9c3490c","user":{"login":"milsyobtaf","id":606158,"avatar_url":"https://avatars.githubusercontent.com/u/606158?v=3","gravatar_id":"","url":"https://api.github.com/users/milsyobtaf","html_url":"https://github.com/milsyobtaf","followers_url":"https://api.github.com/users/milsyobtaf/followers","following_url":"https://api.github.com/users/milsyobtaf/following{/other_user}","gists_url":"https://api.github.com/users/milsyobtaf/gists{/gist_id}","starred_url":"https://api.github.com/users/milsyobtaf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/milsyobtaf/subscriptions","organizations_url":"https://api.github.com/users/milsyobtaf/orgs","repos_url":"https://api.github.com/users/milsyobtaf/repos","events_url":"https://api.github.com/users/milsyobtaf/events{/privacy}","received_events_url":"https://api.github.com/users/milsyobtaf/received_events","type":"User","site_admin":false},"body":"Seriously. I didn't realize you could footnote your links and have it.... just work. :mind-blown:","created_at":"2016-03-29T21:33:44Z","updated_at":"2016-03-29T21:33:44Z","html_url":"https://github.com/tsmith512/blog-posts/pull/2#discussion_r57804822","pull_request_url":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/tsmith512/blog-posts/pulls/comments/57804822"},"html":{"href":"https://github.com/tsmith512/blog-posts/pull/2#discussion_r57804822"},"pull_request":{"href":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2","id":64523704,"html_url":"https://github.com/tsmith512/blog-posts/pull/2","diff_url":"https://github.com/tsmith512/blog-posts/pull/2.diff","patch_url":"https://github.com/tsmith512/blog-posts/pull/2.patch","issue_url":"https://api.github.com/repos/tsmith512/blog-posts/issues/2","number":2,"state":"open","locked":false,"title":"WIP: 2016-03 Aquifer and Build Systems","user":{"login":"tsmith512","id":1486573,"avatar_url":"https://avatars.githubusercontent.com/u/1486573?v=3","gravatar_id":"","url":"https://api.github.com/users/tsmith512","html_url":"https://github.com/tsmith512","followers_url":"https://api.github.com/users/tsmith512/followers","following_url":"https://api.github.com/users/tsmith512/following{/other_user}","gists_url":"https://api.github.com/users/tsmith512/gists{/gist_id}","starred_url":"https://api.github.com/users/tsmith512/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsmith512/subscriptions","organizations_url":"https://api.github.com/users/tsmith512/orgs","repos_url":"https://api.github.com/users/tsmith512/repos","events_url":"https://api.github.com/users/tsmith512/events{/privacy}","received_events_url":"https://api.github.com/users/tsmith512/received_events","type":"User","site_admin":false},"body":"This is a work-in-progress PR so that I can collect some input on a timely post.\r\n\r\nView the rendered markdown at: https://github.com/tsmith512/blog-posts/blob/2016-03-aquifer-and-build-systems/2013-03-aquifer-and-build-systems/README.md or just check the _Files Changed_ tab since there is no media.","created_at":"2016-03-29T19:55:51Z","updated_at":"2016-03-29T21:33:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c13003f98df6810b755469583b46ef44a9ac35ef","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2/commits","review_comments_url":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2/comments","review_comment_url":"https://api.github.com/repos/tsmith512/blog-posts/pulls/comments{/number}","comments_url":"https://api.github.com/repos/tsmith512/blog-posts/issues/2/comments","statuses_url":"https://api.github.com/repos/tsmith512/blog-posts/statuses/17045a4bc4c0940c87529ac07f21ce39b9c3490c","head":{"label":"tsmith512:2016-03-aquifer-and-build-systems","ref":"2016-03-aquifer-and-build-systems","sha":"17045a4bc4c0940c87529ac07f21ce39b9c3490c","user":{"login":"tsmith512","id":1486573,"avatar_url":"https://avatars.githubusercontent.com/u/1486573?v=3","gravatar_id":"","url":"https://api.github.com/users/tsmith512","html_url":"https://github.com/tsmith512","followers_url":"https://api.github.com/users/tsmith512/followers","following_url":"https://api.github.com/users/tsmith512/following{/other_user}","gists_url":"https://api.github.com/users/tsmith512/gists{/gist_id}","starred_url":"https://api.github.com/users/tsmith512/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsmith512/subscriptions","organizations_url":"https://api.github.com/users/tsmith512/orgs","repos_url":"https://api.github.com/users/tsmith512/repos","events_url":"https://api.github.com/users/tsmith512/events{/privacy}","received_events_url":"https://api.github.com/users/tsmith512/received_events","type":"User","site_admin":false},"repo":{"id":52314391,"name":"blog-posts","full_name":"tsmith512/blog-posts","owner":{"login":"tsmith512","id":1486573,"avatar_url":"https://avatars.githubusercontent.com/u/1486573?v=3","gravatar_id":"","url":"https://api.github.com/users/tsmith512","html_url":"https://github.com/tsmith512","followers_url":"https://api.github.com/users/tsmith512/followers","following_url":"https://api.github.com/users/tsmith512/following{/other_user}","gists_url":"https://api.github.com/users/tsmith512/gists{/gist_id}","starred_url":"https://api.github.com/users/tsmith512/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsmith512/subscriptions","organizations_url":"https://api.github.com/users/tsmith512/orgs","repos_url":"https://api.github.com/users/tsmith512/repos","events_url":"https://api.github.com/users/tsmith512/events{/privacy}","received_events_url":"https://api.github.com/users/tsmith512/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tsmith512/blog-posts","description":"","fork":false,"url":"https://api.github.com/repos/tsmith512/blog-posts","forks_url":"https://api.github.com/repos/tsmith512/blog-posts/forks","keys_url":"https://api.github.com/repos/tsmith512/blog-posts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tsmith512/blog-posts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tsmith512/blog-posts/teams","hooks_url":"https://api.github.com/repos/tsmith512/blog-posts/hooks","issue_events_url":"https://api.github.com/repos/tsmith512/blog-posts/issues/events{/number}","events_url":"https://api.github.com/repos/tsmith512/blog-posts/events","assignees_url":"https://api.github.com/repos/tsmith512/blog-posts/assignees{/user}","branches_url":"https://api.github.com/repos/tsmith512/blog-posts/branches{/branch}","tags_url":"https://api.github.com/repos/tsmith512/blog-posts/tags","blobs_url":"https://api.github.com/repos/tsmith512/blog-posts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tsmith512/blog-posts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tsmith512/blog-posts/git/refs{/sha}","trees_url":"https://api.github.com/repos/tsmith512/blog-posts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tsmith512/blog-posts/statuses/{sha}","languages_url":"https://api.github.com/repos/tsmith512/blog-posts/languages","stargazers_url":"https://api.github.com/repos/tsmith512/blog-posts/stargazers","contributors_url":"https://api.github.com/repos/tsmith512/blog-posts/contributors","subscribers_url":"https://api.github.com/repos/tsmith512/blog-posts/subscribers","subscription_url":"https://api.github.com/repos/tsmith512/blog-posts/subscription","commits_url":"https://api.github.com/repos/tsmith512/blog-posts/commits{/sha}","git_commits_url":"https://api.github.com/repos/tsmith512/blog-posts/git/commits{/sha}","comments_url":"https://api.github.com/repos/tsmith512/blog-posts/comments{/number}","issue_comment_url":"https://api.github.com/repos/tsmith512/blog-posts/issues/comments{/number}","contents_url":"https://api.github.com/repos/tsmith512/blog-posts/contents/{+path}","compare_url":"https://api.github.com/repos/tsmith512/blog-posts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tsmith512/blog-posts/merges","archive_url":"https://api.github.com/repos/tsmith512/blog-posts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tsmith512/blog-posts/downloads","issues_url":"https://api.github.com/repos/tsmith512/blog-posts/issues{/number}","pulls_url":"https://api.github.com/repos/tsmith512/blog-posts/pulls{/number}","milestones_url":"https://api.github.com/repos/tsmith512/blog-posts/milestones{/number}","notifications_url":"https://api.github.com/repos/tsmith512/blog-posts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tsmith512/blog-posts/labels{/name}","releases_url":"https://api.github.com/repos/tsmith512/blog-posts/releases{/id}","deployments_url":"https://api.github.com/repos/tsmith512/blog-posts/deployments","created_at":"2016-02-22T23:36:27Z","updated_at":"2016-02-22T23:36:58Z","pushed_at":"2016-03-29T21:21:58Z","git_url":"git://github.com/tsmith512/blog-posts.git","ssh_url":"git@github.com:tsmith512/blog-posts.git","clone_url":"https://github.com/tsmith512/blog-posts.git","svn_url":"https://github.com/tsmith512/blog-posts","homepage":null,"size":2844,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"tsmith512:master","ref":"master","sha":"0fe12ed50eb00c04dd5ccadf45647bdde5790cde","user":{"login":"tsmith512","id":1486573,"avatar_url":"https://avatars.githubusercontent.com/u/1486573?v=3","gravatar_id":"","url":"https://api.github.com/users/tsmith512","html_url":"https://github.com/tsmith512","followers_url":"https://api.github.com/users/tsmith512/followers","following_url":"https://api.github.com/users/tsmith512/following{/other_user}","gists_url":"https://api.github.com/users/tsmith512/gists{/gist_id}","starred_url":"https://api.github.com/users/tsmith512/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsmith512/subscriptions","organizations_url":"https://api.github.com/users/tsmith512/orgs","repos_url":"https://api.github.com/users/tsmith512/repos","events_url":"https://api.github.com/users/tsmith512/events{/privacy}","received_events_url":"https://api.github.com/users/tsmith512/received_events","type":"User","site_admin":false},"repo":{"id":52314391,"name":"blog-posts","full_name":"tsmith512/blog-posts","owner":{"login":"tsmith512","id":1486573,"avatar_url":"https://avatars.githubusercontent.com/u/1486573?v=3","gravatar_id":"","url":"https://api.github.com/users/tsmith512","html_url":"https://github.com/tsmith512","followers_url":"https://api.github.com/users/tsmith512/followers","following_url":"https://api.github.com/users/tsmith512/following{/other_user}","gists_url":"https://api.github.com/users/tsmith512/gists{/gist_id}","starred_url":"https://api.github.com/users/tsmith512/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsmith512/subscriptions","organizations_url":"https://api.github.com/users/tsmith512/orgs","repos_url":"https://api.github.com/users/tsmith512/repos","events_url":"https://api.github.com/users/tsmith512/events{/privacy}","received_events_url":"https://api.github.com/users/tsmith512/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tsmith512/blog-posts","description":"","fork":false,"url":"https://api.github.com/repos/tsmith512/blog-posts","forks_url":"https://api.github.com/repos/tsmith512/blog-posts/forks","keys_url":"https://api.github.com/repos/tsmith512/blog-posts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tsmith512/blog-posts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tsmith512/blog-posts/teams","hooks_url":"https://api.github.com/repos/tsmith512/blog-posts/hooks","issue_events_url":"https://api.github.com/repos/tsmith512/blog-posts/issues/events{/number}","events_url":"https://api.github.com/repos/tsmith512/blog-posts/events","assignees_url":"https://api.github.com/repos/tsmith512/blog-posts/assignees{/user}","branches_url":"https://api.github.com/repos/tsmith512/blog-posts/branches{/branch}","tags_url":"https://api.github.com/repos/tsmith512/blog-posts/tags","blobs_url":"https://api.github.com/repos/tsmith512/blog-posts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tsmith512/blog-posts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tsmith512/blog-posts/git/refs{/sha}","trees_url":"https://api.github.com/repos/tsmith512/blog-posts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tsmith512/blog-posts/statuses/{sha}","languages_url":"https://api.github.com/repos/tsmith512/blog-posts/languages","stargazers_url":"https://api.github.com/repos/tsmith512/blog-posts/stargazers","contributors_url":"https://api.github.com/repos/tsmith512/blog-posts/contributors","subscribers_url":"https://api.github.com/repos/tsmith512/blog-posts/subscribers","subscription_url":"https://api.github.com/repos/tsmith512/blog-posts/subscription","commits_url":"https://api.github.com/repos/tsmith512/blog-posts/commits{/sha}","git_commits_url":"https://api.github.com/repos/tsmith512/blog-posts/git/commits{/sha}","comments_url":"https://api.github.com/repos/tsmith512/blog-posts/comments{/number}","issue_comment_url":"https://api.github.com/repos/tsmith512/blog-posts/issues/comments{/number}","contents_url":"https://api.github.com/repos/tsmith512/blog-posts/contents/{+path}","compare_url":"https://api.github.com/repos/tsmith512/blog-posts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tsmith512/blog-posts/merges","archive_url":"https://api.github.com/repos/tsmith512/blog-posts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tsmith512/blog-posts/downloads","issues_url":"https://api.github.com/repos/tsmith512/blog-posts/issues{/number}","pulls_url":"https://api.github.com/repos/tsmith512/blog-posts/pulls{/number}","milestones_url":"https://api.github.com/repos/tsmith512/blog-posts/milestones{/number}","notifications_url":"https://api.github.com/repos/tsmith512/blog-posts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tsmith512/blog-posts/labels{/name}","releases_url":"https://api.github.com/repos/tsmith512/blog-posts/releases{/id}","deployments_url":"https://api.github.com/repos/tsmith512/blog-posts/deployments","created_at":"2016-02-22T23:36:27Z","updated_at":"2016-02-22T23:36:58Z","pushed_at":"2016-03-29T21:21:58Z","git_url":"git://github.com/tsmith512/blog-posts.git","ssh_url":"git@github.com:tsmith512/blog-posts.git","clone_url":"https://github.com/tsmith512/blog-posts.git","svn_url":"https://github.com/tsmith512/blog-posts","homepage":null,"size":2844,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2"},"html":{"href":"https://github.com/tsmith512/blog-posts/pull/2"},"issue":{"href":"https://api.github.com/repos/tsmith512/blog-posts/issues/2"},"comments":{"href":"https://api.github.com/repos/tsmith512/blog-posts/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/tsmith512/blog-posts/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/tsmith512/blog-posts/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/tsmith512/blog-posts/statuses/17045a4bc4c0940c87529ac07f21ce39b9c3490c"}}}}