Ejemplo n.º 1
0
Archivo: refs.c Proyecto: ratnikov/git
int check_ref_format(const char *ref)
{
	int ch, level, bad_type, last;
	int ret = CHECK_REF_FORMAT_OK;
	const char *cp = ref;

	level = 0;
	while (1) {
		while ((ch = *cp++) == '/')
			; /* tolerate duplicated slashes */
		if (!ch)
			/* should not end with slashes */
			return CHECK_REF_FORMAT_ERROR;

		/* we are at the beginning of the path component */
		if (ch == '.')
			return CHECK_REF_FORMAT_ERROR;
		bad_type = bad_ref_char(ch);
		if (bad_type) {
			if (bad_type == 2 && (!*cp || *cp == '/') &&
			    ret == CHECK_REF_FORMAT_OK)
				ret = CHECK_REF_FORMAT_WILDCARD;
			else
				return CHECK_REF_FORMAT_ERROR;
		}

		last = ch;
		/* scan the rest of the path component */
		while ((ch = *cp++) != 0) {
			bad_type = bad_ref_char(ch);
			if (bad_type)
				return CHECK_REF_FORMAT_ERROR;
			if (ch == '/')
				break;
			if (last == '.' && ch == '.')
				return CHECK_REF_FORMAT_ERROR;
			if (last == '@' && ch == '{')
				return CHECK_REF_FORMAT_ERROR;
			last = ch;
		}
		level++;
		if (!ch) {
			if (ref <= cp - 2 && cp[-2] == '.')
				return CHECK_REF_FORMAT_ERROR;
			if (level < 2)
				return CHECK_REF_FORMAT_ONELEVEL;
			if (has_extension(ref, ".lock"))
				return CHECK_REF_FORMAT_ERROR;
			return ret;
		}
	}
}
Ejemplo n.º 2
0
int check_ref_format(const char *ref)
{
	int ch, level, bad_type;
	const char *cp = ref;

	level = 0;
	while (1) {
		while ((ch = *cp++) == '/')
			; /* tolerate duplicated slashes */
		if (!ch)
			/* should not end with slashes */
			return CHECK_REF_FORMAT_ERROR;

		/* we are at the beginning of the path component */
		if (ch == '.')
			return CHECK_REF_FORMAT_ERROR;
		bad_type = bad_ref_char(ch);
		if (bad_type) {
			return (bad_type == 2 && !*cp)
				? CHECK_REF_FORMAT_WILDCARD
				: CHECK_REF_FORMAT_ERROR;
		}

		/* scan the rest of the path component */
		while ((ch = *cp++) != 0) {
			bad_type = bad_ref_char(ch);
			if (bad_type) {
				return (bad_type == 2 && !*cp)
					? CHECK_REF_FORMAT_WILDCARD
					: CHECK_REF_FORMAT_ERROR;
			}
			if (ch == '/')
				break;
			if (ch == '.' && *cp == '.')
				return CHECK_REF_FORMAT_ERROR;
		}
		level++;
		if (!ch) {
			if (level < 2)
				return CHECK_REF_FORMAT_ONELEVEL;
			return CHECK_REF_FORMAT_OK;
		}
	}
}