summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
f03727c)
When parsing repo_groups ini entries, repo_shell was calling
strip_repo() on the entry value, then calling str_has_word() to see if
the desired repo was in the list of words represented by the ini value.
Of course this is wrong, each token in the value string must have
strip_repo() called upon it instead.
The solution:
* Move strip_repo() to stringutils.c
* Add str_has_repo(), when can call strip_repo() on each token in its
string.
stra_destroy(&acl->userids);
}
stra_destroy(&acl->userids);
}
-/* git tools match /path/to/repo against /path/to/repo.git when the former
- * doesn't exist and the latter does. repo_shell addresses this by stripping
- * the .git prefix off all repopath's read in from .gitacls and the SSH comand
- * line. This mimics the expected git tool behavior except when /path/to/repo
- * and /path/to/repo.git both exist. This case shouldn't ever be seen anyway.
- */
-static char *strip_repo(const char *repo_name)
-{
- if (!repo_name)
- return NULL;
- else {
- char *dot = rindex(repo_name, '.');
-
- if (dot && !strcmp(dot, ".git"))
- return xstrndup(repo_name, dot - repo_name);
- else
- return xstrdup(repo_name);
- }
-}
-
static int acl_handler(void* user, const char* section, const char* name,
const char* value)
{
static int acl_handler(void* user, const char* section, const char* name,
const char* value)
{
stra_add(&acl->userids, name);
}
} else if (!strcmp(section, "repo_groups")) {
stra_add(&acl->userids, name);
}
} else if (!strcmp(section, "repo_groups")) {
- char *v = strip_repo(value);
- if (str_has_word(v, acl->repo)) {
+ if (str_has_repo(value, acl->repo)) {
//debug("repoids += '%s'", name);
stra_add(&acl->repoids, name);
}
//debug("repoids += '%s'", name);
stra_add(&acl->repoids, name);
}
} else if (!strncmp(section, "repo", 4)) {
char *_p = xstrdup(section + 4);
char *p = _p;
} else if (!strncmp(section, "repo", 4)) {
char *_p = xstrdup(section + 4);
char *p = _p;
free(_s);
return false;
}
free(_s);
return false;
}
+
+char *strip_repo(const char *repo_name)
+{
+ if (!repo_name)
+ return NULL;
+ else {
+ char *dot = rindex(repo_name, '.');
+
+ if (dot && !strcmp(dot, ".git"))
+ return xstrndup(repo_name, dot - repo_name);
+ else
+ return xstrdup(repo_name);
+ }
+}
+
+bool str_has_repo(const char* string, const char* repo)
+{
+ char *_s = xstrdup(string);
+ char *s = _s;
+ char *p = my_strtok(&s, " \t\n");
+ char *r = strip_repo(repo);
+
+ while (p) {
+ char *q = strip_repo(p);
+ if (match(q, r)) {
+ free(q);
+ free(r);
+ free(_s);
+ return true;
+ }
+ free(q);
+ p = my_strtok(&s, " \t\n");
+ }
+ free(r);
+ free(_s);
+ return false;
+}
*/
bool match(const char* pattern, const char* string);
*/
bool match(const char* pattern, const char* string);
+/* git tools match /path/to/repo against /path/to/repo.git when the former
+ * doesn't exist and the latter does. repo_shell addresses this by stripping
+ * the .git prefix off all repopath's read in from .gitacls and the SSH comand
+ * line. This mimics the expected git tool behavior except when /path/to/repo
+ * and /path/to/repo.git both exist. This case shouldn't ever be seen anyway.
+ */
+char *strip_repo(const char *repo_name);
+
+/* Returns true if the repo is contained within string. repos are delimited by
+ * any whitespace characters, and the optional '.git' prefix is ignored during
+ * match.
+ */
+bool str_has_repo(const char* string, const char* repo);
+
#endif /* end of include guard: MYSTRTOK_H */
#endif /* end of include guard: MYSTRTOK_H */