summaryrefslogtreecommitdiff
path: root/ref-filter.c
diff options
context:
space:
mode:
authorKarthik Nayak <karthik.188@gmail.com>2017-01-10 08:49:48 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-01-31 20:38:59 (GMT)
commit1a0ca5e358c1af14160e610e346c706e5dccf535 (patch)
tree1728a6743b9b837307398d392873547b3fa84d12 /ref-filter.c
parent3a42980f9e5ecc2b74c538109d4007c630881f1c (diff)
downloadgit-1a0ca5e358c1af14160e610e346c706e5dccf535.zip
git-1a0ca5e358c1af14160e610e346c706e5dccf535.tar.gz
git-1a0ca5e358c1af14160e610e346c706e5dccf535.tar.bz2
ref-filter: modify the 'lstrip=<N>' option to work with negative '<N>'
Currently the 'lstrip=<N>' option only takes a positive value '<N>' and strips '<N>' slash-separated path components from the left. Modify the 'lstrip' option to also take a negative number '<N>' which would strip from the left as necessary and _leave_ behind only 'N' slash-separated path components from the right-most end. For e.g. %(refname:lstrip=-1) would make 'foo/goo/abc' into 'abc'. Add documentation and tests for the same. Signed-off-by: Karthik Nayak <Karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'ref-filter.c')
-rw-r--r--ref-filter.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/ref-filter.c b/ref-filter.c
index 4fd6ef1..2840ca1 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -34,7 +34,7 @@ struct if_then_else {
struct refname_atom {
enum { R_NORMAL, R_SHORT, R_LSTRIP } option;
- unsigned int lstrip;
+ int lstrip;
};
/*
@@ -93,8 +93,8 @@ static void refname_atom_parser_internal(struct refname_atom *atom,
atom->option = R_SHORT;
else if (skip_prefix(arg, "lstrip=", &arg)) {
atom->option = R_LSTRIP;
- if (strtoul_ui(arg, 10, &atom->lstrip) || atom->lstrip <= 0)
- die(_("positive value expected refname:lstrip=%s"), arg);
+ if (strtol_i(arg, 10, &atom->lstrip))
+ die(_("Integer value expected refname:lstrip=%s"), arg);
} else
die(_("unrecognized %%(%s) argument: %s"), name, arg);
}
@@ -1091,12 +1091,28 @@ static inline char *copy_advance(char *dst, const char *src)
return dst;
}
-static const char *lstrip_ref_components(const char *refname, unsigned int len)
+static const char *lstrip_ref_components(const char *refname, int len)
{
long remaining = len;
const char *start = refname;
- while (remaining) {
+ if (len < 0) {
+ int i;
+ const char *p = refname;
+
+ /* Find total no of '/' separated path-components */
+ for (i = 0; p[i]; p[i] == '/' ? i++ : *p++)
+ ;
+ /*
+ * The number of components we need to strip is now
+ * the total minus the components to be left (Plus one
+ * because we count the number of '/', but the number
+ * of components is one more than the no of '/').
+ */
+ remaining = i + len + 1;
+ }
+
+ while (remaining > 0) {
switch (*start++) {
case '\0':
return "";
@@ -1105,6 +1121,7 @@ static const char *lstrip_ref_components(const char *refname, unsigned int len)
break;
}
}
+
return start;
}