1. 08 3月, 2018 1 次提交
  2. 07 3月, 2018 2 次提交
  3. 28 2月, 2018 1 次提交
  4. 23 2月, 2018 1 次提交
  5. 07 2月, 2018 1 次提交
  6. 12 1月, 2018 1 次提交
  7. 19 7月, 2017 2 次提交
    • L
      Fix tests and fine tweak permission error message · d035d735
      Lin Jen-Shin 提交于
      d035d735
    • L
      Eliminate N+1 queries on checking different protected refs · a397a0eb
      Lin Jen-Shin 提交于
      I realized where the N+1 queries were actually coming from
      project.protected_branches, but how come we cannot preload this,
      or cache this at all?
      
      Then I found that this is somehow a Rails limitation. What we're
      doing before, eventually come to:
      
          project.protected_branches.matching
      
      But why it's not cached? (project.protected_branches.loaded? is always
      false) It's because matching is a class method, which is called on
      the proxy. In this case, Rails cannot cache the result. I don't know
      if this is possible to implement or not, because clearly this would
      require some tricks to implement class methods on associations.
      
      So instead, we could just pass project.protected_branches to
      ProtectedRef.matching, then it would work regularly.
      
      With this change, there's no more N+1 queries.
      a397a0eb
  8. 18 7月, 2017 3 次提交
  9. 17 7月, 2017 1 次提交
    • L
      Add RequestStoreWrap to cache via RequestStore · 143fc48a
      Lin Jen-Shin 提交于
      I don't like the idea of `RequestStore` at all, because it's just a
      global state which shouldn't be used at all. But we have a number of
      places calling `ProtectedBranch.protected?` and `ProtectedTag.protected?`
      in a loop for the same user, project, and ref whenever we're checking
      against if the jobs for a given pipeline is accessible for a given user.
      This means we're effectively making N queries for the same thing over
      and over.
      
      To properly fix this, we need to change how we check the permission,
      and that could be a huge work. To solve this quickly, adding a cache
      layer for the given request would be quite simple to do.
      
      We're already doing this in Commit#author, and this is extending that
      idea and make it generalized.
      143fc48a
  10. 04 7月, 2017 2 次提交
    • L
      Introduce Gitlab::Cache::RequestStoreWrap · 216bf78f
      Lin Jen-Shin 提交于
      So that we cache the result of UserAccess#can_push_or_merge_to_branch?
      in RequestStore, avoiding querying ProtectedBranch over and over for
      the list of pipelines (i.e. in PipelineSerializer)
      
      I don't think this is ideal because I don't like the idea of
      RequestStore in general, but this is the easiest way to cache it
      without changing the architecture. In the future we should cache
      more explicitly rather than this kind of global store.
      216bf78f
    • L
      Consistently check permission for creating pipelines, · 23bfd8c1
      Lin Jen-Shin 提交于
      updating builds and updating pipelines. We check against
      being able to merge or push if the ref is protected.
      23bfd8c1
  11. 08 5月, 2017 1 次提交
  12. 28 4月, 2017 1 次提交
  13. 04 4月, 2017 4 次提交
  14. 01 4月, 2017 1 次提交
  15. 10 3月, 2017 2 次提交
  16. 13 1月, 2017 1 次提交
  17. 16 11月, 2016 1 次提交
  18. 16 8月, 2016 1 次提交
  19. 05 8月, 2016 1 次提交
  20. 29 7月, 2016 1 次提交
    • T
      Enforce "No One Can Push" during git operations. · 828f6eb6
      Timothy Andrew 提交于
      1. The crux of this change is in `UserAccess`, which looks through all
         the access levels, asking each if the user has access to push/merge
         for the current project.
      
      2. Update the `protected_branches` factory to create access levels as
         necessary.
      
      3. Fix and augment `user_access` and `git_access` specs.
      828f6eb6
  21. 18 7月, 2016 1 次提交
  22. 14 7月, 2016 1 次提交
  23. 13 7月, 2016 1 次提交
    • T
      Refactor `Gitlab::GitAccess` · 60245bbe
      Timothy Andrew 提交于
      1. Don't use case statements for dispatch anymore. This leads to a lot
         of duplication, and makes the logic harder to follow.
      
      2. Remove duplicated logic.
      
          - For example, the `can_push_to_branch?` exists, but we also have a
            different way of checking the same condition within `change_access_check`.
      
          - This kind of duplication is removed, and the `can_push_to_branch?`
            method is used in both places.
      
      3. Move checks returning true/false to `UserAccess`.
      
          - All public methods in `GitAccess` now return an instance of
            `GitAccessStatus`. Previously, some methods would return
            true/false as well, which was confusing.
      
          - It makes sense for these kinds of checks to be at the level of a
            user, so the `UserAccess` class was repurposed for this. The prior
            `UserAccess.allowed?` classmethod is converted into an instance
            method.
      
          - All external uses of these checks have been migrated to use the
            `UserAccess` class
      
      4. Move the "change_access_check" into a separate class.
      
          - Create the `GitAccess::ChangeAccessCheck` class to run these
            checks, which are quite substantial.
      
          - `ChangeAccessCheck` returns an instance of `GitAccessStatus` as
            well.
      
      5. Break out the boolean logic in `ChangeAccessCheck` into `if/else`
         chains - this seems more readable.
      
      6. I can understand that this might look like overkill for !4892, but I
         think this is a good opportunity to clean it up.
      
          - http://martinfowler.com/bliki/OpportunisticRefactoring.html
      60245bbe
  24. 10 3月, 2016 2 次提交
  25. 07 8月, 2014 1 次提交
  26. 15 5月, 2014 1 次提交