📄 opt.c
字号:
{ if (is_url) { ret = svn_opt_parse_revision(&start_revision, &end_revision, "head", pool); } else { ret = svn_opt_parse_revision(&start_revision, &end_revision, "base", pool); } } else /* looking at non-empty peg revision */ { const char *rev_str = path + i + 1; if (is_url) { /* URLs are URI-encoded, so we look for dates with URI-encoded delimeters. */ int rev_len = strlen(rev_str); if (rev_len > 6 && rev_str[0] == '%' && rev_str[1] == '7' && (rev_str[2] == 'B' || rev_str[2] == 'b') && rev_str[rev_len-3] == '%' && rev_str[rev_len-2] == '7' && (rev_str[rev_len-1] == 'D' || rev_str[rev_len-1] == 'd')) { rev_str = svn_path_uri_decode(rev_str, pool); } } ret = svn_opt_parse_revision(&start_revision, &end_revision, rev_str, pool); } if (ret || end_revision.kind != svn_opt_revision_unspecified) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Syntax error parsing revision '%s'"), path + i + 1); *truepath = svn_path_canonicalize(apr_pstrndup(pool, path, i), pool); rev->kind = start_revision.kind; rev->value = start_revision.value; return SVN_NO_ERROR; } } /* Didn't find an @-sign. */ *truepath = svn_path_canonicalize(path, pool); rev->kind = svn_opt_revision_unspecified; return SVN_NO_ERROR;}svn_error_t *svn_opt_args_to_target_array2(apr_array_header_t **targets_p, apr_getopt_t *os, apr_array_header_t *known_targets, apr_pool_t *pool){ int i; apr_array_header_t *input_targets = apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *)); apr_array_header_t *output_targets = apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *)); /* Step 1: create a master array of targets that are in UTF-8 encoding, and come from concatenating the targets left by apr_getopt, plus any extra targets (e.g., from the --targets switch.) */ for (; os->ind < os->argc; os->ind++) { /* The apr_getopt targets are still in native encoding. */ const char *raw_target = os->argv[os->ind]; SVN_ERR(svn_utf_cstring_to_utf8 ((const char **) apr_array_push(input_targets), raw_target, pool)); } if (known_targets) { for (i = 0; i < known_targets->nelts; i++) { /* The --targets array have already been converted to UTF-8, because we needed to split up the list with svn_cstring_split. */ const char *utf8_target = APR_ARRAY_IDX(known_targets, i, const char *); (*((const char **) apr_array_push(input_targets))) = utf8_target; } } /* Step 2: process each target. */ for (i = 0; i < input_targets->nelts; i++) { const char *utf8_target = APR_ARRAY_IDX(input_targets, i, const char *); const char *target; /* after all processing is finished */ /* URLs and wc-paths get treated differently. */ if (svn_path_is_url(utf8_target)) { /* No need to canonicalize a URL's case or path separators. */ /* Convert to URI. */ target = svn_path_uri_from_iri(utf8_target, pool); /* Auto-escape some ASCII characters. */ target = svn_path_uri_autoescape(target, pool); /* The above doesn't guarantee a valid URI. */ if (! svn_path_is_uri_safe(target)) return svn_error_createf(SVN_ERR_BAD_URL, 0, _("URL '%s' is not properly URI-encoded"), utf8_target); /* Verify that no backpaths are present in the URL. */ if (svn_path_is_backpath_present(target)) return svn_error_createf(SVN_ERR_BAD_URL, 0, _("URL '%s' contains a '..' element"), utf8_target); /* strip any trailing '/' */ target = svn_path_canonicalize(target, pool); } else /* not a url, so treat as a path */ { const char *apr_target; const char *base_name; char *truenamed_target; /* APR-encoded */ apr_status_t apr_err; /* canonicalize case, and change all separators to '/'. */ SVN_ERR(svn_path_cstring_from_utf8(&apr_target, utf8_target, pool)); apr_err = apr_filepath_merge(&truenamed_target, "", apr_target, APR_FILEPATH_TRUENAME, pool); if (!apr_err) /* We have a canonicalized APR-encoded target now. */ apr_target = truenamed_target; else if (APR_STATUS_IS_ENOENT(apr_err)) /* It's okay for the file to not exist, that just means we have to accept the case given to the client. We'll use the original APR-encoded target. */ ; else return svn_error_createf(apr_err, NULL, _("Error resolving case of '%s'"), svn_path_local_style(utf8_target, pool)); /* convert back to UTF-8. */ SVN_ERR(svn_path_cstring_to_utf8(&target, apr_target, pool)); target = svn_path_canonicalize(target, pool); /* If the target has the same name as a Subversion working copy administrative dir, skip it. */ base_name = svn_path_basename(target, pool); /* FIXME: The canonical list of administrative directory names is maintained in libsvn_wc/adm_files.c:svn_wc_set_adm_dir(). That list can't be used here, because that use would create a circular dependency between libsvn_wc and libsvn_subr. Make sure changes to the lists are always synchronized! */ if (0 == strcmp(base_name, ".svn") || 0 == strcmp(base_name, "_svn")) continue; } (*((const char **) apr_array_push(output_targets))) = target; } /* kff todo: need to remove redundancies from targets before passing it to the cmd_func. */ *targets_p = output_targets; return SVN_NO_ERROR;}svn_error_t *svn_opt_args_to_target_array(apr_array_header_t **targets_p, apr_getopt_t *os, apr_array_header_t *known_targets, svn_opt_revision_t *start_revision, svn_opt_revision_t *end_revision, svn_boolean_t extract_revisions, apr_pool_t *pool){ apr_array_header_t *output_targets; SVN_ERR(svn_opt_args_to_target_array2(&output_targets, os, known_targets, pool)); if (extract_revisions) { svn_opt_revision_t temprev; const char *path; if (output_targets->nelts > 0) { path = ((const char **) (output_targets->elts))[0]; SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool)); if (temprev.kind != svn_opt_revision_unspecified) { ((const char **) (output_targets->elts))[0] = path; start_revision->kind = temprev.kind; start_revision->value = temprev.value; } } if (output_targets->nelts > 1) { path = ((const char **) (output_targets->elts))[1]; SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool)); if (temprev.kind != svn_opt_revision_unspecified) { ((const char **) (output_targets->elts))[1] = path; end_revision->kind = temprev.kind; end_revision->value = temprev.value; } } } *targets_p = output_targets; return SVN_NO_ERROR;}/* Print version info for PGM_NAME. If QUIET is true, print in * brief. Else if QUIET is not true, print the version more * verbosely, and if FOOTER is non-null, print it following the * version information. * * Use POOL for temporary allocations. */static svn_error_t *print_version_info(const char *pgm_name, const char *footer, svn_boolean_t quiet, apr_pool_t *pool){ if (quiet) { SVN_ERR(svn_cmdline_printf(pool, "%s\n", SVN_VER_NUMBER)); return SVN_NO_ERROR; } SVN_ERR(svn_cmdline_printf(pool, _("%s, version %s\n" " compiled %s, %s\n\n"), pgm_name, SVN_VERSION, __DATE__, __TIME__)); SVN_ERR(svn_cmdline_fputs(_("Copyright (C) 2000-2006 CollabNet.\n" "Subversion is open source software, see" " http://subversion.tigris.org/\n" "This product includes software developed by " "CollabNet (http://www.Collab.Net/).\n\n"), stdout, pool)); if (footer) { SVN_ERR(svn_cmdline_printf(pool, "%s\n", footer)); } return SVN_NO_ERROR;}svn_error_t *svn_opt_print_help2(apr_getopt_t *os, const char *pgm_name, svn_boolean_t print_version, svn_boolean_t quiet, const char *version_footer, const char *header, const svn_opt_subcommand_desc2_t *cmd_table, const apr_getopt_option_t *option_table, const char *footer, apr_pool_t *pool){ apr_array_header_t *targets = NULL; int i; if (os) SVN_ERR(svn_opt_parse_all_args(&targets, os, pool)); if (cmd_table && targets && targets->nelts) /* help on subcommand(s) requested */ for (i = 0; i < targets->nelts; i++) { svn_opt_subcommand_help2(((const char **) (targets->elts))[i], cmd_table, option_table, pool); } else if (print_version) /* just --version */ SVN_ERR(print_version_info(pgm_name, version_footer, quiet, pool)); else if (os && !targets->nelts) /* `-h', `--help', or `help' */ svn_opt_print_generic_help2(header, cmd_table, option_table, footer, pool, stdout); else /* unknown option or cmd */ SVN_ERR(svn_cmdline_fprintf(stderr, pool, _("Type '%s help' for usage.\n"), pgm_name)); return SVN_NO_ERROR;}svn_error_t *svn_opt_print_help(apr_getopt_t *os, const char *pgm_name, svn_boolean_t print_version, svn_boolean_t quiet, const char *version_footer, const char *header, const svn_opt_subcommand_desc_t *cmd_table, const apr_getopt_option_t *option_table, const char *footer, apr_pool_t *pool){ apr_array_header_t *targets = NULL; int i; if (os) SVN_ERR(svn_opt_parse_all_args(&targets, os, pool)); if (cmd_table && targets && targets->nelts) /* help on subcommand(s) requested */ for (i = 0; i < targets->nelts; i++) { svn_opt_subcommand_help(((const char **) (targets->elts))[i], cmd_table, option_table, pool); } else if (print_version) /* just --version */ SVN_ERR(print_version_info(pgm_name, version_footer, quiet, pool)); else if (os && !targets->nelts) /* `-h', `--help', or `help' */ svn_opt_print_generic_help(header, cmd_table, option_table, footer, pool, stdout); else /* unknown option or cmd */ SVN_ERR(svn_cmdline_fprintf(stderr, pool, _("Type '%s help' for usage.\n"), pgm_name)); return SVN_NO_ERROR;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -