{"action":"created","comment":{"url":"https://api.github.com/repos/cvmfs/cvmfs/pulls/comments/38872394","id":38872394,"diff_hunk":"@@ -0,0 +1,237 @@\n+/*\n+ * This file is part of the CernVM File System.\n+ */\n+\n+#include <gtest/gtest.h>\n+\n+#include <sys/stat.h>\n+#include <unistd.h>\n+\n+#include \"../../cvmfs/catalog.h\"\n+#include \"../../cvmfs/catalog_mgr.h\"\n+#include \"../../cvmfs/hash.h\"\n+#include \"../../cvmfs/shortstring.h\"\n+#include \"../../cvmfs/util.h\"\n+#include \"testutil.h\"\n+\n+using namespace std;  // NOLINT\n+\n+\n+namespace catalog {\n+\n+class T_CatalogManager : public ::testing::Test {\n+ public:\n+  T_CatalogManager() : statistics_(), catalog_mgr_(&statistics_) { }\n+\n+ protected:\n+  void AddTree() {\n+    const shash::Any empty_hash = shash::Any();\n+    const size_t file_size = 4096;\n+    char suffix = shash::kSha1;\n+    shash::Any hash;\n+    shash::Any empty_content;\n+    // adding \"\"\n+    MockCatalog *root_catalog = catalog_mgr_.RetrieveRootCatalog();\n+    root_catalog->AddFile(empty_content, file_size, \"\", \"\");\n+    // adding \"/dir\"\n+    root_catalog->AddFile(empty_content, file_size, \"\", \"dir\");\n+    // adding \"/file1\"\n+    hash = shash::Any(shash::kSha1,\n+                      reinterpret_cast<const unsigned char*>(hashes[0]),\n+                      suffix);\n+    root_catalog->AddFile(hash, file_size, \"\", \"file1\");\n+    // adding \"/dir/dir\"\n+    root_catalog->AddFile(empty_content, file_size, \"/dir\", \"dir\");\n+    // adding \"/dir/dir/file2\"\n+    hash = shash::Any(shash::kSha1,\n+                      reinterpret_cast<const unsigned char*>(hashes[1]),\n+                      suffix);\n+    root_catalog->AddFile(hash, file_size, \"/dir/dir\", \"file2\");\n+    // adding \"/dir/dir/dir\"\n+    root_catalog->AddFile(empty_content, file_size, \"/dir/dir\", \"dir\");\n+    // adding a nested catalog in \"/dir/dir/dir\"\n+    string catalog_path_str = \"/dir/dir/dir\";\n+    PathString catalog_path(catalog_path_str.c_str(),\n+                            catalog_path_str.length());\n+    MockCatalog *new_catalog = new MockCatalog(\"/dir/dir/dir\", shash::Any(),\n+                                               4096, 1, 0, false,\n+                                               root_catalog, NULL);\n+    ASSERT_NE(static_cast<MockCatalog*>(NULL), new_catalog);\n+    ASSERT_EQ(1u, root_catalog->GetChildren().size());\n+    catalog_mgr_.RegisterNewCatalog(new_catalog);\n+    // adding \"/dir/dir/dir/file3\" to the new nested catalog\n+    hash = shash::Any(shash::kSha1,\n+                      reinterpret_cast<const unsigned char*>(hashes[2]),\n+                      suffix);\n+    new_catalog->AddFile(hash, file_size, \"/dir/dir/dir\", \"file3\");\n+    // adding \"/dir/dir/dir/file4\" to the new nested catalog\n+    hash = shash::Any(shash::kSha1,\n+                      reinterpret_cast<const unsigned char*>(hashes[3]),\n+                      suffix);\n+    new_catalog->AddFile(hash, file_size, \"/dir/dir/dir\", \"file4\");\n+    // adding \"/dir/dir/dir/dir\"\n+    new_catalog->AddFile(empty_content, file_size, \"/dir/dir/dir\", \"dir\");\n+    // adding \"/dir/dir/dir/dir/dir\"\n+    new_catalog->AddFile(empty_content, file_size, \"/dir/dir/dir/dir\", \"dir\");\n+    // we haven't mounted the second catalog yet!\n+    ASSERT_EQ(1, catalog_mgr_.GetNumCatalogs());\n+\n+    // mounting a new catalog in \"/dir/dir/dir/dir/dir\"\n+    MockCatalog *new_catalog_2 = new MockCatalog(\"/dir/dir/dir/dir/dir\",\n+                                                 shash::Any(),\n+                                                 4096, 1, 0, false,\n+                                                 new_catalog, NULL);\n+    ASSERT_EQ(1u, root_catalog->GetChildren().size());\n+    catalog_mgr_.RegisterNewCatalog(new_catalog_2);\n+    // adding \"/dir/dir/dir/dir/dir/file5\"\n+    hash = shash::Any(shash::kSha1,\n+                      reinterpret_cast<const unsigned char*>(hashes[4]),\n+                      suffix);\n+    new_catalog_2->AddFile(hash, file_size, \"/dir/dir/dir/dir/dir\", \"file5\");\n+    // we haven't mounted the third catalog yet!\n+    ASSERT_EQ(1, catalog_mgr_.GetNumCatalogs());\n+  }\n+\n+ protected:\n+  static const char *hashes[];\n+  perf::Statistics statistics_;\n+  MockCatalogManager catalog_mgr_;\n+};\n+\n+const char *T_CatalogManager::hashes[] = {\n+     \"b026324c6904b2a9cb4b88d6d61c81d1000000\",\n+     \"26ab0db90d72e28ad0ba1e22ee510510000000\",\n+     \"6d7fce9fee471194aa8b5b6e47267f03000000\",\n+     \"48a24b70a0b376535542b996af517398000000\",\n+     \"1dcca23355272056f04fe8bf20edfce0000000\"\n+};\n+\n+\n+\n+TEST_F(T_CatalogManager, InitialConfiguration) {\n+  EXPECT_TRUE(catalog_mgr_.Init());\n+  EXPECT_EQ(1, catalog_mgr_.GetNumCatalogs());\n+  EXPECT_EQ(1u, catalog_mgr_.GetRevision());\n+  EXPECT_FALSE(catalog_mgr_.GetVolatileFlag());\n+  EXPECT_EQ(0u, catalog_mgr_.GetTTL());\n+}\n+\n+TEST_F(T_CatalogManager, Statistics) {\n+  EXPECT_TRUE(catalog_mgr_.Init());\n+  const Statistics &st = catalog_mgr_.statistics();\n+  EXPECT_EQ(0u, st.n_listing->Get());\n+  EXPECT_EQ(0u, st.n_lookup_inode->Get());\n+  EXPECT_EQ(0u, st.n_lookup_path->Get());\n+  EXPECT_EQ(0u, st.n_lookup_path_negative->Get());\n+  EXPECT_EQ(0u, st.n_lookup_xattrs->Get());\n+  EXPECT_EQ(0u, st.n_nested_listing->Get());\n+}\n+\n+TEST_F(T_CatalogManager, InodeConfiguration) {\n+  InodeGenerationAnnotation annotation;\n+  catalog_mgr_.SetInodeAnnotation(&annotation);\n+  EXPECT_TRUE(catalog_mgr_.Init());\n+}\n+\n+TEST_F(T_CatalogManager, Lookup) {\n+  catalog::DirectoryEntry dirent;\n+  ASSERT_TRUE(catalog_mgr_.Init());\n+  AddTree();\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/dir\", kLookupSole, &dirent));\n+  EXPECT_TRUE(dirent.IsDirectory());\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/dir/dir\", kLookupSole, &dirent));\n+  EXPECT_TRUE(dirent.IsDirectory());\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/file1\", kLookupSole, &dirent));\n+  EXPECT_TRUE(dirent.IsRegular());\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/file1\", kLookupFull, &dirent));\n+  EXPECT_TRUE(dirent.IsRegular());\n+  // the father directory belongs to the catalog, so there is no problem\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/dir/dir/file2\", kLookupFull, &dirent));\n+  EXPECT_TRUE(dirent.IsRegular());\n+  // /dir/dir/dir/file4 belongs to a catalog that is not mounted yet\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/dir/dir/dir/file4\", kLookupSole,\n+                                      &dirent));\n+  // the new catalog should be mounted now\n+  EXPECT_EQ(2, catalog_mgr_.GetNumCatalogs());\n+\n+  // the father directory should also belong to the nested catalog\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/dir/dir/dir/file4\", kLookupFull,\n+                                      &dirent));\n+  // it is not a symplink, so it should crash\n+  EXPECT_DEATH(catalog_mgr_.LookupPath(\"/dir/dir/dir/file4\", kLookupRawSymlink,\n+                                      &dirent), \".*\");\n+\n+  // load the next catalog\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/dir/dir/dir/dir/dir/file5\",\n+                                      kLookupFull, &dirent));\n+  // the new catalog should be mounted now\n+  EXPECT_EQ(3, catalog_mgr_.GetNumCatalogs());\n+}\n+\n+TEST_F(T_CatalogManager, LongLookup) {\n+  catalog::DirectoryEntry dirent;\n+  ASSERT_TRUE(catalog_mgr_.Init());\n+  AddTree();\n+  EXPECT_TRUE(catalog_mgr_.LookupPath(\"/dir/dir/dir/dir/dir/file5\",\n+                                      kLookupFull, &dirent));\n+  EXPECT_TRUE(dirent.IsRegular());\n+  // we should have mounted two catalogs\n+  EXPECT_EQ(3, catalog_mgr_.GetNumCatalogs());\n+}\n+\n+TEST_F(T_CatalogManager, Listing) {\n+  catalog::DirectoryEntry dirent;\n+  ASSERT_TRUE(catalog_mgr_.Init());\n+  AddTree();\n+  DirectoryEntryList del;\n+  EXPECT_FALSE(catalog_mgr_.Listing(\"/fakepath\", &del));\n+  EXPECT_EQ(0u, del.size());\n+  EXPECT_TRUE(catalog_mgr_.Listing(\"/dir/dir\", &del));\n+  EXPECT_EQ(2u, del.size());\n+  // now it will have to mount the nested catalog\n+  EXPECT_TRUE(catalog_mgr_.Listing(\"/dir/dir/dir\", &del));\n+  EXPECT_EQ(3u, del.size());\n+  EXPECT_EQ(2, catalog_mgr_.GetNumCatalogs());\n+  // mounting the next nested catalog\n+  EXPECT_TRUE(catalog_mgr_.Listing(\"/dir/dir/dir/dir/dir\", &del));\n+  EXPECT_EQ(1u, del.size());\n+  EXPECT_EQ(3, catalog_mgr_.GetNumCatalogs());\n+}\n+\n+TEST_F(T_CatalogManager, LongListing) {\n+  catalog::DirectoryEntry dirent;\n+  ASSERT_TRUE(catalog_mgr_.Init());\n+  AddTree();\n+  DirectoryEntryList del;\n+  // mounting the directly the deepest nested catalog\n+  EXPECT_TRUE(catalog_mgr_.Listing(\"/dir/dir/dir/dir/dir\", &del));\n+  EXPECT_EQ(1u, del.size());\n+  EXPECT_EQ(3, catalog_mgr_.GetNumCatalogs());\n+}\n+\n+TEST_F(T_CatalogManager, FailListing) {\n+  catalog::DirectoryEntry dirent;\n+  ASSERT_TRUE(catalog_mgr_.Init());\n+  AddTree();\n+  DirectoryEntryList del;\n+  // trying with a fake path inside the nested catalog\n+  EXPECT_EQ(1, catalog_mgr_.GetNumCatalogs());\n+  EXPECT_FALSE(catalog_mgr_.Listing(\"/dir/dir/dir/fakedir\", &del));\n+  EXPECT_EQ(0u, del.size());\n+  // even though the listing failed it should have loaded the nested catalog\n+  EXPECT_EQ(2, catalog_mgr_.GetNumCatalogs());\n+  // trying now with the next nested catalog\n+  EXPECT_FALSE(catalog_mgr_.Listing(\"/dir/dir/dir/dir/dir/fakedir\", &del));\n+  EXPECT_EQ(0u, del.size());\n+  EXPECT_EQ(3, catalog_mgr_.GetNumCatalogs());\n+}\n+\n+TEST_F(T_CatalogManager, Remount) {\n+  EXPECT_TRUE(catalog_mgr_.Init());\n+  LoadError le;\n+  EXPECT_EQ(kLoadNew, le = catalog_mgr_.Remount(true));\n+  EXPECT_EQ(\"loaded new catalog\", Code2Ascii(le));","path":"test/unittests/t_catalog_mgr.cc","position":233,"original_position":233,"commit_id":"07377672460c3366a85bd755a62d209fe79f56d0","original_commit_id":"07377672460c3366a85bd755a62d209fe79f56d0","user":{"login":"jblomer","id":1557360,"avatar_url":"https://avatars.githubusercontent.com/u/1557360?v=3","gravatar_id":"","url":"https://api.github.com/users/jblomer","html_url":"https://github.com/jblomer","followers_url":"https://api.github.com/users/jblomer/followers","following_url":"https://api.github.com/users/jblomer/following{/other_user}","gists_url":"https://api.github.com/users/jblomer/gists{/gist_id}","starred_url":"https://api.github.com/users/jblomer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jblomer/subscriptions","organizations_url":"https://api.github.com/users/jblomer/orgs","repos_url":"https://api.github.com/users/jblomer/repos","events_url":"https://api.github.com/users/jblomer/events{/privacy}","received_events_url":"https://api.github.com/users/jblomer/received_events","type":"User","site_admin":false},"body":"that can be removed, we might change the error explanation text","created_at":"2015-09-07T16:22:13Z","updated_at":"2015-09-07T16:22:13Z","html_url":"https://github.com/cvmfs/cvmfs/pull/1058#discussion_r38872394","pull_request_url":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058","_links":{"self":{"href":"https://api.github.com/repos/cvmfs/cvmfs/pulls/comments/38872394"},"html":{"href":"https://github.com/cvmfs/cvmfs/pull/1058#discussion_r38872394"},"pull_request":{"href":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058"}}},"pull_request":{"url":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058","id":42832490,"html_url":"https://github.com/cvmfs/cvmfs/pull/1058","diff_url":"https://github.com/cvmfs/cvmfs/pull/1058.diff","patch_url":"https://github.com/cvmfs/cvmfs/pull/1058.patch","issue_url":"https://api.github.com/repos/cvmfs/cvmfs/issues/1058","number":1058,"state":"open","locked":false,"title":"Catalog Manager Test 2","user":{"login":"Moliholy","id":2722756,"avatar_url":"https://avatars.githubusercontent.com/u/2722756?v=3","gravatar_id":"","url":"https://api.github.com/users/Moliholy","html_url":"https://github.com/Moliholy","followers_url":"https://api.github.com/users/Moliholy/followers","following_url":"https://api.github.com/users/Moliholy/following{/other_user}","gists_url":"https://api.github.com/users/Moliholy/gists{/gist_id}","starred_url":"https://api.github.com/users/Moliholy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Moliholy/subscriptions","organizations_url":"https://api.github.com/users/Moliholy/orgs","repos_url":"https://api.github.com/users/Moliholy/repos","events_url":"https://api.github.com/users/Moliholy/events{/privacy}","received_events_url":"https://api.github.com/users/Moliholy/received_events","type":"User","site_admin":false},"body":"Completes the tests for the catalog manager class. It includes https://github.com/cvmfs/cvmfs/pull/1057","created_at":"2015-08-19T16:03:21Z","updated_at":"2015-09-07T16:22:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"afe2bb2d8c758db856741607c58f270e026285e3","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058/commits","review_comments_url":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058/comments","review_comment_url":"https://api.github.com/repos/cvmfs/cvmfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cvmfs/cvmfs/issues/1058/comments","statuses_url":"https://api.github.com/repos/cvmfs/cvmfs/statuses/07377672460c3366a85bd755a62d209fe79f56d0","head":{"label":"Moliholy:catalog-mgr-2","ref":"catalog-mgr-2","sha":"07377672460c3366a85bd755a62d209fe79f56d0","user":{"login":"Moliholy","id":2722756,"avatar_url":"https://avatars.githubusercontent.com/u/2722756?v=3","gravatar_id":"","url":"https://api.github.com/users/Moliholy","html_url":"https://github.com/Moliholy","followers_url":"https://api.github.com/users/Moliholy/followers","following_url":"https://api.github.com/users/Moliholy/following{/other_user}","gists_url":"https://api.github.com/users/Moliholy/gists{/gist_id}","starred_url":"https://api.github.com/users/Moliholy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Moliholy/subscriptions","organizations_url":"https://api.github.com/users/Moliholy/orgs","repos_url":"https://api.github.com/users/Moliholy/repos","events_url":"https://api.github.com/users/Moliholy/events{/privacy}","received_events_url":"https://api.github.com/users/Moliholy/received_events","type":"User","site_admin":false},"repo":{"id":32462131,"name":"cvmfs","full_name":"Moliholy/cvmfs","owner":{"login":"Moliholy","id":2722756,"avatar_url":"https://avatars.githubusercontent.com/u/2722756?v=3","gravatar_id":"","url":"https://api.github.com/users/Moliholy","html_url":"https://github.com/Moliholy","followers_url":"https://api.github.com/users/Moliholy/followers","following_url":"https://api.github.com/users/Moliholy/following{/other_user}","gists_url":"https://api.github.com/users/Moliholy/gists{/gist_id}","starred_url":"https://api.github.com/users/Moliholy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Moliholy/subscriptions","organizations_url":"https://api.github.com/users/Moliholy/orgs","repos_url":"https://api.github.com/users/Moliholy/repos","events_url":"https://api.github.com/users/Moliholy/events{/privacy}","received_events_url":"https://api.github.com/users/Moliholy/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Moliholy/cvmfs","description":"The CernVM File System","fork":true,"url":"https://api.github.com/repos/Moliholy/cvmfs","forks_url":"https://api.github.com/repos/Moliholy/cvmfs/forks","keys_url":"https://api.github.com/repos/Moliholy/cvmfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Moliholy/cvmfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Moliholy/cvmfs/teams","hooks_url":"https://api.github.com/repos/Moliholy/cvmfs/hooks","issue_events_url":"https://api.github.com/repos/Moliholy/cvmfs/issues/events{/number}","events_url":"https://api.github.com/repos/Moliholy/cvmfs/events","assignees_url":"https://api.github.com/repos/Moliholy/cvmfs/assignees{/user}","branches_url":"https://api.github.com/repos/Moliholy/cvmfs/branches{/branch}","tags_url":"https://api.github.com/repos/Moliholy/cvmfs/tags","blobs_url":"https://api.github.com/repos/Moliholy/cvmfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Moliholy/cvmfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Moliholy/cvmfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/Moliholy/cvmfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Moliholy/cvmfs/statuses/{sha}","languages_url":"https://api.github.com/repos/Moliholy/cvmfs/languages","stargazers_url":"https://api.github.com/repos/Moliholy/cvmfs/stargazers","contributors_url":"https://api.github.com/repos/Moliholy/cvmfs/contributors","subscribers_url":"https://api.github.com/repos/Moliholy/cvmfs/subscribers","subscription_url":"https://api.github.com/repos/Moliholy/cvmfs/subscription","commits_url":"https://api.github.com/repos/Moliholy/cvmfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/Moliholy/cvmfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/Moliholy/cvmfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/Moliholy/cvmfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/Moliholy/cvmfs/contents/{+path}","compare_url":"https://api.github.com/repos/Moliholy/cvmfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Moliholy/cvmfs/merges","archive_url":"https://api.github.com/repos/Moliholy/cvmfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Moliholy/cvmfs/downloads","issues_url":"https://api.github.com/repos/Moliholy/cvmfs/issues{/number}","pulls_url":"https://api.github.com/repos/Moliholy/cvmfs/pulls{/number}","milestones_url":"https://api.github.com/repos/Moliholy/cvmfs/milestones{/number}","notifications_url":"https://api.github.com/repos/Moliholy/cvmfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Moliholy/cvmfs/labels{/name}","releases_url":"https://api.github.com/repos/Moliholy/cvmfs/releases{/id}","created_at":"2015-03-18T14:00:48Z","updated_at":"2015-05-07T13:17:12Z","pushed_at":"2015-09-07T16:18:44Z","git_url":"git://github.com/Moliholy/cvmfs.git","ssh_url":"git@github.com:Moliholy/cvmfs.git","clone_url":"https://github.com/Moliholy/cvmfs.git","svn_url":"https://github.com/Moliholy/cvmfs","homepage":"http://cernvm.cern.ch/portal/filesystem","size":91420,"stargazers_count":0,"watchers_count":0,"language":"C","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":"devel"}},"base":{"label":"cvmfs:devel","ref":"devel","sha":"89e0edfa09dc836b7c94e7f0b0ba38817eba97d1","user":{"login":"cvmfs","id":1560859,"avatar_url":"https://avatars.githubusercontent.com/u/1560859?v=3","gravatar_id":"","url":"https://api.github.com/users/cvmfs","html_url":"https://github.com/cvmfs","followers_url":"https://api.github.com/users/cvmfs/followers","following_url":"https://api.github.com/users/cvmfs/following{/other_user}","gists_url":"https://api.github.com/users/cvmfs/gists{/gist_id}","starred_url":"https://api.github.com/users/cvmfs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cvmfs/subscriptions","organizations_url":"https://api.github.com/users/cvmfs/orgs","repos_url":"https://api.github.com/users/cvmfs/repos","events_url":"https://api.github.com/users/cvmfs/events{/privacy}","received_events_url":"https://api.github.com/users/cvmfs/received_events","type":"Organization","site_admin":false},"repo":{"id":3784908,"name":"cvmfs","full_name":"cvmfs/cvmfs","owner":{"login":"cvmfs","id":1560859,"avatar_url":"https://avatars.githubusercontent.com/u/1560859?v=3","gravatar_id":"","url":"https://api.github.com/users/cvmfs","html_url":"https://github.com/cvmfs","followers_url":"https://api.github.com/users/cvmfs/followers","following_url":"https://api.github.com/users/cvmfs/following{/other_user}","gists_url":"https://api.github.com/users/cvmfs/gists{/gist_id}","starred_url":"https://api.github.com/users/cvmfs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cvmfs/subscriptions","organizations_url":"https://api.github.com/users/cvmfs/orgs","repos_url":"https://api.github.com/users/cvmfs/repos","events_url":"https://api.github.com/users/cvmfs/events{/privacy}","received_events_url":"https://api.github.com/users/cvmfs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cvmfs/cvmfs","description":"The CernVM File System","fork":false,"url":"https://api.github.com/repos/cvmfs/cvmfs","forks_url":"https://api.github.com/repos/cvmfs/cvmfs/forks","keys_url":"https://api.github.com/repos/cvmfs/cvmfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cvmfs/cvmfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cvmfs/cvmfs/teams","hooks_url":"https://api.github.com/repos/cvmfs/cvmfs/hooks","issue_events_url":"https://api.github.com/repos/cvmfs/cvmfs/issues/events{/number}","events_url":"https://api.github.com/repos/cvmfs/cvmfs/events","assignees_url":"https://api.github.com/repos/cvmfs/cvmfs/assignees{/user}","branches_url":"https://api.github.com/repos/cvmfs/cvmfs/branches{/branch}","tags_url":"https://api.github.com/repos/cvmfs/cvmfs/tags","blobs_url":"https://api.github.com/repos/cvmfs/cvmfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cvmfs/cvmfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cvmfs/cvmfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/cvmfs/cvmfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cvmfs/cvmfs/statuses/{sha}","languages_url":"https://api.github.com/repos/cvmfs/cvmfs/languages","stargazers_url":"https://api.github.com/repos/cvmfs/cvmfs/stargazers","contributors_url":"https://api.github.com/repos/cvmfs/cvmfs/contributors","subscribers_url":"https://api.github.com/repos/cvmfs/cvmfs/subscribers","subscription_url":"https://api.github.com/repos/cvmfs/cvmfs/subscription","commits_url":"https://api.github.com/repos/cvmfs/cvmfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/cvmfs/cvmfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/cvmfs/cvmfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/cvmfs/cvmfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/cvmfs/cvmfs/contents/{+path}","compare_url":"https://api.github.com/repos/cvmfs/cvmfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cvmfs/cvmfs/merges","archive_url":"https://api.github.com/repos/cvmfs/cvmfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cvmfs/cvmfs/downloads","issues_url":"https://api.github.com/repos/cvmfs/cvmfs/issues{/number}","pulls_url":"https://api.github.com/repos/cvmfs/cvmfs/pulls{/number}","milestones_url":"https://api.github.com/repos/cvmfs/cvmfs/milestones{/number}","notifications_url":"https://api.github.com/repos/cvmfs/cvmfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cvmfs/cvmfs/labels{/name}","releases_url":"https://api.github.com/repos/cvmfs/cvmfs/releases{/id}","created_at":"2012-03-21T09:10:41Z","updated_at":"2015-08-21T09:25:14Z","pushed_at":"2015-09-07T16:18:45Z","git_url":"git://github.com/cvmfs/cvmfs.git","ssh_url":"git@github.com:cvmfs/cvmfs.git","clone_url":"https://github.com/cvmfs/cvmfs.git","svn_url":"https://github.com/cvmfs/cvmfs","homepage":"http://cernvm.cern.ch/portal/filesystem","size":98567,"stargazers_count":38,"watchers_count":38,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":9,"forks":42,"open_issues":9,"watchers":38,"default_branch":"devel"}},"_links":{"self":{"href":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058"},"html":{"href":"https://github.com/cvmfs/cvmfs/pull/1058"},"issue":{"href":"https://api.github.com/repos/cvmfs/cvmfs/issues/1058"},"comments":{"href":"https://api.github.com/repos/cvmfs/cvmfs/issues/1058/comments"},"review_comments":{"href":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058/comments"},"review_comment":{"href":"https://api.github.com/repos/cvmfs/cvmfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cvmfs/cvmfs/pulls/1058/commits"},"statuses":{"href":"https://api.github.com/repos/cvmfs/cvmfs/statuses/07377672460c3366a85bd755a62d209fe79f56d0"}}}}