On Thu, Nov 8, 2012 at 12:34 PM, vijay <vi...@collab.net> wrote: > On Wednesday 07 November 2012 08:57 PM, Stefan Fuhrmann wrote: > >> On Wed, Nov 7, 2012 at 3:02 PM, vijay <vi...@collab.net >> <mailto:vi...@collab.net>> wrote: >> >> On Tuesday 06 November 2012 08:09 PM, Stefan Fuhrmann wrote: >> >> On Mon, Nov 5, 2012 at 5:24 PM, vijay <vi...@collab.net >> <mailto:vi...@collab.net> >> <mailto:vi...@collab.net <mailto:vi...@collab.net>>> wrote: >> >> Hi, >> >> This patch implements '--include-externals' option to 'svn >> list' >> [Issue #4225] [1]. >> >> All tests pass with 'make check' & 'make davautocheck'. >> >> Attached the patch and log message. >> >> Please review this patch and share your thoughts. >> >> Thanks in advance for your time. >> >> Thanks & Regards, >> Vijayaguru >> >> [1] >> >> http://subversion.tigris.org/_**___issues/show_bug.cgi?id=4225<http://subversion.tigris.org/____issues/show_bug.cgi?id=4225> >> >> <http://subversion.tigris.org/**__issues/show_bug.cgi?id=4225<http://subversion.tigris.org/__issues/show_bug.cgi?id=4225> >> > >> >> >> <http://subversion.tigris.org/** >> __issues/show_bug.cgi?id=4225<http://subversion.tigris.org/__issues/show_bug.cgi?id=4225> >> >> <http://subversion.tigris.org/**issues/show_bug.cgi?id=4225<http://subversion.tigris.org/issues/show_bug.cgi?id=4225> >> >> >> >> >> Hi Vijay, >> >> Not sure whether these points have already been >> discussed in previous threads, but the following >> two points caught my attention: >> >> +typedef svn_error_t *(*svn_client_list_func2_t)( >> + void *baton, >> + const char *path, >> + const svn_dirent_t *dirent, >> + const svn_lock_t *lock, >> + const char *abs_path, >> >> o.k. >> >> + svn_boolean_t notify_external_start, >> + svn_boolean_t notify_external_end, >> + const char *external_parent_url, >> + const char *external_target, >> >> Maybe, this should be modeled to create a more "seamless" >> appearance. Only keep the external_parent_url member. >> If it is NULL, this entry has not been pulled in here by >> some external. Otherwise it contains the parent URL as >> defined by your patch. >> >> I don't see the see the need to expose more information. >> Why would you need to group externals? The external_target >> member should be given implicitly by path / dirent. >> Am I missing something here? >> >> >> >> The external_target member will not be given by path / dirent. >> We will get it by parsing the externals description. >> >> Suppose that path1 in repo1 has svn:externals set to path2 in repo2. >> >> When we list path1 with externals included, >> >> 1. First, list path1. >> 2. Then, process all the externals defined under path1. Parse >> through the individual external description and populate >> external_target. >> >> For example, >> >> external description under path1: >> external_desc = exdir http://<url-of-path2-in-repo2> >> >> external_target = exdir >> external_parent_url = http://<url-of-path1-in-repo1> >> >> url of external = http://<url-of-path2-in-repo2> >> >> 3. List the entries by reaching 'url of external'. >> >> >> OK, I now see what you are trying to do here - >> I had read to much into the code. >> >> However, in this form, the added functionality is >> of limited use, IMHO. I understand that what you >> list is basically which paths you would get for a >> "svn co $url". >> >> While this is fine, I see two issues with it: >> >> * trees don't get overlayed. Example: >> $>svn ls $URL -R >> sub1 >> sub1/fileA >> sub1/fileB >> sub2 >> $>svn propget "svn:externals" $URL >> http://somewhere/ sub1/subsub >> $>svn ls $URL -R --include-externals >> sub1 >> sub1/fileA >> sub1/fileB >> sub2 >> sub1/subsub [external]. >> >> Desired output >> sub1 >> sub1/fileA >> sub1/fileB >> sub1/subsub [external @$URL]. >> sub2 >> > > I was referring externals related code base in checkout/update and export > while implementing this option. > > From subversion/libsvn_client/**update.c > <snip> > /* We handle externals after the update is complete, so that > > handling external items (and any errors therefrom) doesn't delay > the primary operation. */ > </snip> > > So I preferred the same for 'list' also. But there is a difference in > externals processing between the commands checkout/update and list. The > former processes the externals by default. The latter processes externals > only if we specifically ask it. What should we do here?
I think if the goal is to behave the same way that export / co do, then your approach is correct. I can live with that. Listing externals seems to be unusual enough to not make it the default in our CL UI. I would expect many tools to run "svn ls" and expect each line to contain an actual sub-folder or file. There is no need to break that assumption by default. Compatibility trumps consistency in that case. >> * result of ls on a sub-folder results in less output >> $>svn ls $URL/sub1 -R --include-externals >> fileA >> fileB >> >> Desired output: >> fileA >> fileB >> subsub [external @$URL]. >> > > > Bert raised the same question and C-Mike answered here [1]. > Thanks for the pointer. > The current implementation uses svn_ra_get_dir() to fetch all properties > and filters "svn:externals" under current list target. I don't know how to > extend it for externals defined higher up in the tree. > If we want to follow the "do as co does" route, reading info from higher up the tree would be inconsistent. In fact, if I can't get a nice in-lined handling of externals, I would prefer the implementation to fetch exactly the data within the given sub-tree. Due to the reuse of ra sessions, this is faster than two svn_client_* calls and requesting parent info for every call would slow things down again. -- Stefan^2. -- Certified & Supported Apache Subversion Downloads: * http://www.wandisco.com/subversion/download *