On Mon, Nov 14, 2016 at 11:55 PM, Jacob Keller <jacob.keller@xxxxxxxxx> wrote: > On Mon, Nov 14, 2016 at 10:48 PM, Karthik Nayak <karthik.188@xxxxxxxxx> wrote: >> On Tue, Nov 15, 2016 at 1:21 AM, Junio C Hamano <gitster@xxxxxxxxx> wrote: >>> Karthik Nayak <karthik.188@xxxxxxxxx> writes: >>> >>>>> - More importantly, what do these do? I do not think of a good >>>>> description that generalizes "base of refs/foo/bar/boz is foo" to >>>>> explain your :base. >>>> >>>> $ ./git for-each-ref --format "%(refname)%(end) %(refname:dir)" >>>> refs/heads/master refs/heads >>>> refs/heads/ref-filter refs/heads >>>> refs/remotes/junio/va/i18n refs/remotes/junio/va >>>> >>>> $ ./git for-each-ref refs/heads --format >>>> "%(align:left,30)%(refname)%(end) %(refname:base)" >>>> refs/heads/master heads >>>> refs/heads/ref-filter heads >>>> refs/remotes/junio/va/i18n remotes >>>> >>>> I guess this should clear it up. >>> >>> Hmph. >>> >>> I would guess from these examples that :dir is an equivalent to >>> dirname(). But it is unclear how :base is defined. Is it the path >>> component that comes immediately after "refs/" that appears at the >>> beginning? >> >> ':dir' is equivalent to dirname(). Yup, base is the folder right after 'refs/'. >> For local branches it is 'heads' for remotes it is 'remotes'. This is useful >> when we want to make decisions based on the type of branch we're dealing >> with (using along with %(if)...%(end)). >> >> -- >> Regards, >> Karthik Nayak > > > dirname makes sense. What about implementing a reverse variant of > strip, which you could perform stripping of right-most components and > instead of stripping by a number, strip "to" a number, ie: keep the > left N most components, and then you could use something like > > "keep=2" to keep "refs/heads" > > ? > > I think that would be more general purpose than basename, and less confusing? > > Thanks, > Jake You could even make it compatible with strip so that: "keep=2,strip=1" would return the equivalent of base? Thanks, Jake