Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Make private quote_path() in wt-status.c available as quote_path_rela…
Browse files Browse the repository at this point in the history
…tive()

Move quote_path() from wt-status.c to quote.c and rename it as
quote_path_relative(), because it is a better name for a public function.

Also, instead of handcrafted quoting, quote_c_style_counted() is now used,
to make its quoting more consistent with the rest of the system, also
honoring core.quotepath specified in configuration.

Signed-off-by: Dmitry Potapov <dpotapov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
dmpot authored and gitster committed Mar 8, 2008
1 parent 7941859 commit a734d0b
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 45 deletions.
42 changes: 42 additions & 0 deletions quote.c
Expand Up @@ -260,6 +260,48 @@ extern void write_name_quotedpfx(const char *pfx, size_t pfxlen,
fputc(terminator, fp);
}

/* quote path as relative to the given prefix */
char *quote_path_relative(const char *in, int len,
struct strbuf *out, const char *prefix)
{
int needquote;

if (len < 0)
len = strlen(in);

/* "../" prefix itself does not need quoting, but "in" might. */
needquote = next_quote_pos(in, len) < len;
strbuf_setlen(out, 0);
strbuf_grow(out, len);

if (needquote)
strbuf_addch(out, '"');
if (prefix) {
int off = 0;
while (prefix[off] && off < len && prefix[off] == in[off])
if (prefix[off] == '/') {
prefix += off + 1;
in += off + 1;
len -= off + 1;
off = 0;
} else
off++;

for (; *prefix; prefix++)
if (*prefix == '/')
strbuf_addstr(out, "../");
}

quote_c_style_counted (in, len, out, NULL, 1);

if (needquote)
strbuf_addch(out, '"');
if (!out->len)
strbuf_addstr(out, "./");

return out->buf;
}

/*
* C-style name unquoting.
*
Expand Down
4 changes: 4 additions & 0 deletions quote.h
Expand Up @@ -47,6 +47,10 @@ extern void write_name_quoted(const char *name, FILE *, int terminator);
extern void write_name_quotedpfx(const char *pfx, size_t pfxlen,
const char *name, FILE *, int terminator);

/* quote path as relative to the given prefix */
char *quote_path_relative(const char *in, int len,
struct strbuf *out, const char *prefix);

/* quoting as a string literal for other languages */
extern void perl_quote_print(FILE *stream, const char *src);
extern void python_quote_print(FILE *stream, const char *src);
Expand Down
47 changes: 2 additions & 45 deletions wt-status.c
Expand Up @@ -7,6 +7,7 @@
#include "diff.h"
#include "revision.h"
#include "diffcore.h"
#include "quote.h"

int wt_status_relative_paths = 1;
int wt_status_use_color = -1;
Expand Down Expand Up @@ -82,51 +83,7 @@ static void wt_status_print_trailer(struct wt_status *s)
color_fprintf_ln(s->fp, color(WT_STATUS_HEADER), "#");
}

static char *quote_path(const char *in, int len,
struct strbuf *out, const char *prefix)
{
if (len < 0)
len = strlen(in);

strbuf_grow(out, len);
strbuf_setlen(out, 0);
if (prefix) {
int off = 0;
while (prefix[off] && off < len && prefix[off] == in[off])
if (prefix[off] == '/') {
prefix += off + 1;
in += off + 1;
len -= off + 1;
off = 0;
} else
off++;

for (; *prefix; prefix++)
if (*prefix == '/')
strbuf_addstr(out, "../");
}

for ( ; len > 0; in++, len--) {
int ch = *in;

switch (ch) {
case '\n':
strbuf_addstr(out, "\\n");
break;
case '\r':
strbuf_addstr(out, "\\r");
break;
default:
strbuf_addch(out, ch);
continue;
}
}

if (!out->len)
strbuf_addstr(out, "./");

return out->buf;
}
#define quote_path quote_path_relative

static void wt_status_print_filepair(struct wt_status *s,
int t, struct diff_filepair *p)
Expand Down

0 comments on commit a734d0b

Please sign in to comment.