hgext/narrow/narrowspec.py
changeset 36138 8fd0a9e2d7e9
parent 36137 b8bbe589fd47
child 36197 0fe7e39dc683
equal deleted inserted replaced
36137:b8bbe589fd47 36138:8fd0a9e2d7e9
   151     spec = format(includepats, excludepats)
   151     spec = format(includepats, excludepats)
   152     if repo.shared():
   152     if repo.shared():
   153         repo = share._getsrcrepo(repo)
   153         repo = share._getsrcrepo(repo)
   154     repo.vfs.write(FILENAME, spec)
   154     repo.vfs.write(FILENAME, spec)
   155 
   155 
   156 def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes,
   156 def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes):
   157                      invalid_includes=None):
       
   158     r""" Restricts the patterns according to repo settings,
   157     r""" Restricts the patterns according to repo settings,
   159     results in a logical AND operation
   158     results in a logical AND operation
   160 
   159 
   161     :param req_includes: requested includes
   160     :param req_includes: requested includes
   162     :param req_excludes: requested excludes
   161     :param req_excludes: requested excludes
   163     :param repo_includes: repo includes
   162     :param repo_includes: repo includes
   164     :param repo_excludes: repo excludes
   163     :param repo_excludes: repo excludes
   165     :param invalid_includes: an array to collect invalid includes
   164     :return: include patterns, exclude patterns, and invalid include patterns.
   166     :return: include and exclude patterns
       
   167 
   165 
   168     >>> restrictpatterns({'f1','f2'}, {}, ['f1'], [])
   166     >>> restrictpatterns({'f1','f2'}, {}, ['f1'], [])
   169     (set(['f1']), {})
   167     (set(['f1']), {}, [])
   170     >>> restrictpatterns({'f1'}, {}, ['f1','f2'], [])
   168     >>> restrictpatterns({'f1'}, {}, ['f1','f2'], [])
   171     (set(['f1']), {})
   169     (set(['f1']), {}, [])
   172     >>> restrictpatterns({'f1/fc1', 'f3/fc3'}, {}, ['f1','f2'], [])
   170     >>> restrictpatterns({'f1/fc1', 'f3/fc3'}, {}, ['f1','f2'], [])
   173     (set(['f1/fc1']), {})
   171     (set(['f1/fc1']), {}, [])
   174     >>> restrictpatterns({'f1_fc1'}, {}, ['f1','f2'], [])
   172     >>> restrictpatterns({'f1_fc1'}, {}, ['f1','f2'], [])
   175     ([], set(['path:.']))
   173     ([], set(['path:.']), [])
   176     >>> restrictpatterns({'f1/../f2/fc2'}, {}, ['f1','f2'], [])
   174     >>> restrictpatterns({'f1/../f2/fc2'}, {}, ['f1','f2'], [])
   177     (set(['f2/fc2']), {})
   175     (set(['f2/fc2']), {}, [])
   178     >>> restrictpatterns({'f1/../f3/fc3'}, {}, ['f1','f2'], [])
   176     >>> restrictpatterns({'f1/../f3/fc3'}, {}, ['f1','f2'], [])
   179     ([], set(['path:.']))
   177     ([], set(['path:.']), [])
   180     >>> restrictpatterns({'f1/$non_exitent_var'}, {}, ['f1','f2'], [])
   178     >>> restrictpatterns({'f1/$non_exitent_var'}, {}, ['f1','f2'], [])
   181     (set(['f1/$non_exitent_var']), {})
   179     (set(['f1/$non_exitent_var']), {}, [])
   182     """
   180     """
   183     res_excludes = set(req_excludes)
   181     res_excludes = set(req_excludes)
   184     res_excludes.update(repo_excludes)
   182     res_excludes.update(repo_excludes)
       
   183     invalid_includes = []
   185     if not req_includes:
   184     if not req_includes:
   186         res_includes = set(repo_includes)
   185         res_includes = set(repo_includes)
   187     elif 'path:.' not in repo_includes:
   186     elif 'path:.' not in repo_includes:
   188         res_includes = []
   187         res_includes = []
   189         for req_include in req_includes:
   188         for req_include in req_includes:
   195             for repo_include in repo_includes:
   194             for repo_include in repo_includes:
   196                 if req_include.startswith(repo_include + '/'):
   195                 if req_include.startswith(repo_include + '/'):
   197                     valid = True
   196                     valid = True
   198                     res_includes.append(req_include)
   197                     res_includes.append(req_include)
   199                     break
   198                     break
   200             if not valid and invalid_includes is not None:
   199             if not valid:
   201                 invalid_includes.append(req_include)
   200                 invalid_includes.append(req_include)
   202         if len(res_includes) == 0:
   201         if len(res_includes) == 0:
   203             res_excludes = {'path:.'}
   202             res_excludes = {'path:.'}
   204         else:
   203         else:
   205             res_includes = set(res_includes)
   204             res_includes = set(res_includes)
   206     else:
   205     else:
   207         res_includes = set(req_includes)
   206         res_includes = set(req_includes)
   208     return res_includes, res_excludes
   207     return res_includes, res_excludes, invalid_includes