docs: def file(ui, repo, clname, pat, *pats, **opts):
  	"""assign files to or remove files from a change list
  
  	Assign files to or (with -d) remove files from a change list.
  
  	The -d option only removes files from the change list.
  	It does not edit them or remove them from the repository.
  	"""
  	if codereview_disabled:
  		raise hg_util.Abort(codereview_disabled)
  
  	pats = tuple([pat] + list(pats))
  	if not GoodCLName(clname):
  		return "invalid CL name " + clname
  
  	dirty = {}
  	cl, err = LoadCL(ui, repo, clname, web=False)
  	if err != '':
  		return err
  	if not cl.local:
  		return "cannot change non-local CL " + clname
  
  	files = ChangedFiles(ui, repo, pats)
  
  	if opts["delete"]:
  		oldfiles = Intersect(files, cl.files)
  		if oldfiles:
  			if not ui.quiet:
  				ui.status("# Removing files from CL.  To undo:\n")
  				ui.status("#	cd %s\n" % (repo.root))
  				for f in oldfiles:
  					ui.status("#	hg file %s %s\n" % (cl.name, f))
  			cl.files = Sub(cl.files, oldfiles)
  			cl.Flush(ui, repo)
  		else:
  			ui.status("no such files in CL")
  		return
  
  	if not files:
  		return "no such modified files"
  
  	files = Sub(files, cl.files)
  	taken = Taken(ui, repo)
  	warned = False
  	for f in files:
  		if f in taken:
  			if not warned and not ui.quiet:
  				ui.status("# Taking files from other CLs.  To undo:\n")
  				ui.status("#	cd %s\n" % (repo.root))
  				warned = True
  			ocl = taken[f]
  			if not ui.quiet:
  				ui.status("#	hg file %s %s\n" % (ocl.name, f))
  			if ocl not in dirty:
  				ocl.files = Sub(ocl.files, files)
  				dirty[ocl] = True
  	cl.files = Add(cl.files, files)
  	dirty[cl] = True
  	for d, _ in dirty.items():
  		d.Flush(ui, repo)
  	return