\r
#### fixes\r
\r
-- Fixed nullpointer on recursively calculating folder sizes when there is a named pipe in the hierarchy\r
+- Can't set reset settings with $ or { characters through Gitblit Manager because they are not properly escaped\r
+\r
+#### additions\r
- \r
- - Chinese translation (github/dapengme)\r
++ \r
++ - Implemented multiple repository owners (github/akquinet)\r
++ - Chinese translation (github/dapengme, github/yin8086)\r
+\r
+### Older Releases\r
+\r
+<div class="alert alert-info">\r
+<h4>Update Note 1.2.1</h4>\r
+Because there are now several types of files and folders that must be considered Gitblit data, the default location for data has changed.\r
+<p>You will need to move a few files around when upgrading. Please see the Upgrading section of the <a href="setup.html">setup</a> page for details.</p>\r
+\r
+<b>Express Users</b> make sure to update your web.xml file with the ${baseFolder} values!\r
+</div>\r
+\r
+#### fixes\r
+\r
+- Fixed nullpointer on recursively calculating folder sizes when there is a named pipe or symlink in the hierarchy\r
+- Added nullchecking when concurrently forking a repository and trying to display it's fork network (issue-187)\r
+- Fixed bug where permission changes were not visible in the web ui to a logged-in user until the user logged-out and then logged back in again (issue-186)\r
- Fixed nullpointer on creating a repository with mixed case (issue 185)\r
-- Fixed nullpointer when using web.allowForking = true && git.cacheRepositoryList = false (issue 182)\r
+- Include missing model classes in api library (issue-184)\r
+- Fixed nullpointer when using *web.allowForking = true* && *git.cacheRepositoryList = false* (issue 182)\r
+- Likely fix for commit and commitdiff page failures when a submodule reference changes (issue 178)\r
- Build project models from the repository model cache, when possible, to reduce page load time (issue 172)\r
- Fixed loading of Brazilian Portuguese translation from *nix server (github/inaiat)\r
\r
clone.useTickets = useTickets;\r
clone.skipSizeCalculation = skipSizeCalculation;\r
clone.skipSummaryMetrics = skipSummaryMetrics;\r
+ clone.sparkleshareId = sparkleshareId; \r
return clone;\r
}\r
- }
+ \r
+ public void addOwner(String username) {\r
+ if (!StringUtils.isEmpty(username)) {\r
+ String name = username.toLowerCase();\r
+ // a set would be more efficient, but this complicates JSON\r
+ // deserialization so we enforce uniqueness with an arraylist\r
+ if (!owners.contains(name)) {\r
+ owners.add(name);\r
+ }\r
+ }\r
+ }\r
+ \r
+ public void removeOwner(String username) {\r
+ if (!StringUtils.isEmpty(username)) {\r
+ owners.remove(username.toLowerCase());\r
+ }\r
+ }\r
+ \r
+ public void addOwners(Collection<String> usernames) {\r
+ if (!ArrayUtils.isEmpty(usernames)) {\r
+ for (String username : usernames) {\r
+ addOwner(username);\r
+ }\r
+ }\r
+ }\r
+ \r
+ public void removeOwners(Collection<String> usernames) {\r
+ if (!ArrayUtils.isEmpty(owners)) {\r
+ for (String username : usernames) {\r
+ removeOwner(username);\r
+ }\r
+ }\r
+ }\r
-}
++}