abspath: add absolute_pathdup()
authorRené Scharfe <l.s.r@web.de>
Thu, 26 Jan 2017 17:47:45 +0000 (18:47 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 Jan 2017 22:51:06 +0000 (14:51 -0800)
Add a function that returns a buffer containing the absolute path of its
argument and a semantic patch for its intended use. It avoids an extra
string copy to a static buffer.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
abspath.c
cache.h
contrib/coccinelle/xstrdup_or_null.cocci
index 2825de85912fc730d9a40fa66f4f83b6250a4171..af82abd033ae8361adf825a01567ab5c1d472468 100644 (file)
--- a/abspath.c
+++ b/abspath.c
@@ -152,6 +152,13 @@ const char *absolute_path(const char *path)
        return sb.buf;
 }
 
+char *absolute_pathdup(const char *path)
+{
+       struct strbuf sb = STRBUF_INIT;
+       strbuf_add_absolute_path(&sb, path);
+       return strbuf_detach(&sb, NULL);
+}
+
 /*
  * Unlike prefix_path, this should be used if the named file does
  * not have to interact with index entry; i.e. name of a random file
diff --git a/cache.h b/cache.h
index 1ec9021a70083ea40ee21add8ba766ea9b9c5e25..f481e61f66870d9574bc8a1e82dbc1ec2240384a 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1033,6 +1033,7 @@ int is_directory(const char *);
 const char *real_path(const char *path);
 const char *real_path_if_valid(const char *path);
 const char *absolute_path(const char *path);
+char *absolute_pathdup(const char *path);
 const char *remove_leading_path(const char *in, const char *prefix);
 const char *relative_path(const char *in, const char *prefix, struct strbuf *sb);
 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len);
index 3fceef132bf57623e04a080d03da9aff951f1c11..8e05d1ca4b61b9792a6f7cc4e7d322efeab02e01 100644 (file)
@@ -5,3 +5,9 @@ expression V;
 - if (E)
 -    V = xstrdup(E);
 + V = xstrdup_or_null(E);
+
+@@
+expression E;
+@@
+- xstrdup(absolute_path(E))
++ absolute_pathdup(E)