author | Natanael Copa <natanael.copa@gmail.com> | 2008-11-30 05:49:07 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2008-11-30 12:39:53 (UTC) |
commit | 314d9ea5a3bc60ec518e314bb0bf8072123dc08f (patch) (unidiff) | |
tree | ca65f83e89b301ff6df228785c73c8413a072361 | |
parent | 7b5cee65fd9cf31e4f19ce4ff613778cb95512a9 (diff) | |
download | cgit-314d9ea5a3bc60ec518e314bb0bf8072123dc08f.zip cgit-314d9ea5a3bc60ec518e314bb0bf8072123dc08f.tar.gz cgit-314d9ea5a3bc60ec518e314bb0bf8072123dc08f.tar.bz2 |
Set prefix in snapshots when using dwimmery
This patch sets the directory prefix in archives to be the filename,
excluding the suffix (.tar.gz, .tar.bz2 etc).
The patch also removes the prefix parameter in cgit_print_snapshot()
as the prefix might differ.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cmd.c | 3 | ||||
-rw-r--r-- | ui-snapshot.c | 14 | ||||
-rw-r--r-- | ui-snapshot.h | 3 |
3 files changed, 14 insertions, 6 deletions
@@ -43,123 +43,122 @@ static void about_fn(struct cgit_context *ctx) | |||
43 | cgit_print_site_readme(); | 43 | cgit_print_site_readme(); |
44 | } | 44 | } |
45 | 45 | ||
46 | static void blob_fn(struct cgit_context *ctx) | 46 | static void blob_fn(struct cgit_context *ctx) |
47 | { | 47 | { |
48 | cgit_print_blob(ctx->qry.sha1, ctx->qry.path, ctx->qry.head); | 48 | cgit_print_blob(ctx->qry.sha1, ctx->qry.path, ctx->qry.head); |
49 | } | 49 | } |
50 | 50 | ||
51 | static void commit_fn(struct cgit_context *ctx) | 51 | static void commit_fn(struct cgit_context *ctx) |
52 | { | 52 | { |
53 | cgit_print_commit(ctx->qry.sha1); | 53 | cgit_print_commit(ctx->qry.sha1); |
54 | } | 54 | } |
55 | 55 | ||
56 | static void diff_fn(struct cgit_context *ctx) | 56 | static void diff_fn(struct cgit_context *ctx) |
57 | { | 57 | { |
58 | cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); | 58 | cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); |
59 | } | 59 | } |
60 | 60 | ||
61 | static void info_fn(struct cgit_context *ctx) | 61 | static void info_fn(struct cgit_context *ctx) |
62 | { | 62 | { |
63 | cgit_clone_info(ctx); | 63 | cgit_clone_info(ctx); |
64 | } | 64 | } |
65 | 65 | ||
66 | static void log_fn(struct cgit_context *ctx) | 66 | static void log_fn(struct cgit_context *ctx) |
67 | { | 67 | { |
68 | cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count, | 68 | cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count, |
69 | ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1); | 69 | ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1); |
70 | } | 70 | } |
71 | 71 | ||
72 | static void ls_cache_fn(struct cgit_context *ctx) | 72 | static void ls_cache_fn(struct cgit_context *ctx) |
73 | { | 73 | { |
74 | ctx->page.mimetype = "text/plain"; | 74 | ctx->page.mimetype = "text/plain"; |
75 | ctx->page.filename = "ls-cache.txt"; | 75 | ctx->page.filename = "ls-cache.txt"; |
76 | cgit_print_http_headers(ctx); | 76 | cgit_print_http_headers(ctx); |
77 | cache_ls(ctx->cfg.cache_root); | 77 | cache_ls(ctx->cfg.cache_root); |
78 | } | 78 | } |
79 | 79 | ||
80 | static void objects_fn(struct cgit_context *ctx) | 80 | static void objects_fn(struct cgit_context *ctx) |
81 | { | 81 | { |
82 | cgit_clone_objects(ctx); | 82 | cgit_clone_objects(ctx); |
83 | } | 83 | } |
84 | 84 | ||
85 | static void repolist_fn(struct cgit_context *ctx) | 85 | static void repolist_fn(struct cgit_context *ctx) |
86 | { | 86 | { |
87 | cgit_print_repolist(); | 87 | cgit_print_repolist(); |
88 | } | 88 | } |
89 | 89 | ||
90 | static void patch_fn(struct cgit_context *ctx) | 90 | static void patch_fn(struct cgit_context *ctx) |
91 | { | 91 | { |
92 | cgit_print_patch(ctx->qry.sha1); | 92 | cgit_print_patch(ctx->qry.sha1); |
93 | } | 93 | } |
94 | 94 | ||
95 | static void plain_fn(struct cgit_context *ctx) | 95 | static void plain_fn(struct cgit_context *ctx) |
96 | { | 96 | { |
97 | cgit_print_plain(ctx); | 97 | cgit_print_plain(ctx); |
98 | } | 98 | } |
99 | 99 | ||
100 | static void refs_fn(struct cgit_context *ctx) | 100 | static void refs_fn(struct cgit_context *ctx) |
101 | { | 101 | { |
102 | cgit_print_refs(); | 102 | cgit_print_refs(); |
103 | } | 103 | } |
104 | 104 | ||
105 | static void snapshot_fn(struct cgit_context *ctx) | 105 | static void snapshot_fn(struct cgit_context *ctx) |
106 | { | 106 | { |
107 | cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, | 107 | cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, ctx->qry.path, |
108 | cgit_repobasename(ctx->repo->url), ctx->qry.path, | ||
109 | ctx->repo->snapshots, ctx->qry.nohead); | 108 | ctx->repo->snapshots, ctx->qry.nohead); |
110 | } | 109 | } |
111 | 110 | ||
112 | static void summary_fn(struct cgit_context *ctx) | 111 | static void summary_fn(struct cgit_context *ctx) |
113 | { | 112 | { |
114 | cgit_print_summary(); | 113 | cgit_print_summary(); |
115 | } | 114 | } |
116 | 115 | ||
117 | static void tag_fn(struct cgit_context *ctx) | 116 | static void tag_fn(struct cgit_context *ctx) |
118 | { | 117 | { |
119 | cgit_print_tag(ctx->qry.sha1); | 118 | cgit_print_tag(ctx->qry.sha1); |
120 | } | 119 | } |
121 | 120 | ||
122 | static void tree_fn(struct cgit_context *ctx) | 121 | static void tree_fn(struct cgit_context *ctx) |
123 | { | 122 | { |
124 | cgit_print_tree(ctx->qry.sha1, ctx->qry.path); | 123 | cgit_print_tree(ctx->qry.sha1, ctx->qry.path); |
125 | } | 124 | } |
126 | 125 | ||
127 | #define def_cmd(name, want_repo, want_layout) \ | 126 | #define def_cmd(name, want_repo, want_layout) \ |
128 | {#name, name##_fn, want_repo, want_layout} | 127 | {#name, name##_fn, want_repo, want_layout} |
129 | 128 | ||
130 | struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) | 129 | struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) |
131 | { | 130 | { |
132 | static struct cgit_cmd cmds[] = { | 131 | static struct cgit_cmd cmds[] = { |
133 | def_cmd(HEAD, 1, 0), | 132 | def_cmd(HEAD, 1, 0), |
134 | def_cmd(atom, 1, 0), | 133 | def_cmd(atom, 1, 0), |
135 | def_cmd(about, 0, 1), | 134 | def_cmd(about, 0, 1), |
136 | def_cmd(blob, 1, 0), | 135 | def_cmd(blob, 1, 0), |
137 | def_cmd(commit, 1, 1), | 136 | def_cmd(commit, 1, 1), |
138 | def_cmd(diff, 1, 1), | 137 | def_cmd(diff, 1, 1), |
139 | def_cmd(info, 1, 0), | 138 | def_cmd(info, 1, 0), |
140 | def_cmd(log, 1, 1), | 139 | def_cmd(log, 1, 1), |
141 | def_cmd(ls_cache, 0, 0), | 140 | def_cmd(ls_cache, 0, 0), |
142 | def_cmd(objects, 1, 0), | 141 | def_cmd(objects, 1, 0), |
143 | def_cmd(patch, 1, 0), | 142 | def_cmd(patch, 1, 0), |
144 | def_cmd(plain, 1, 0), | 143 | def_cmd(plain, 1, 0), |
145 | def_cmd(refs, 1, 1), | 144 | def_cmd(refs, 1, 1), |
146 | def_cmd(repolist, 0, 0), | 145 | def_cmd(repolist, 0, 0), |
147 | def_cmd(snapshot, 1, 0), | 146 | def_cmd(snapshot, 1, 0), |
148 | def_cmd(summary, 1, 1), | 147 | def_cmd(summary, 1, 1), |
149 | def_cmd(tag, 1, 1), | 148 | def_cmd(tag, 1, 1), |
150 | def_cmd(tree, 1, 1), | 149 | def_cmd(tree, 1, 1), |
151 | }; | 150 | }; |
152 | int i; | 151 | int i; |
153 | 152 | ||
154 | if (ctx->qry.page == NULL) { | 153 | if (ctx->qry.page == NULL) { |
155 | if (ctx->repo) | 154 | if (ctx->repo) |
156 | ctx->qry.page = "summary"; | 155 | ctx->qry.page = "summary"; |
157 | else | 156 | else |
158 | ctx->qry.page = "repolist"; | 157 | ctx->qry.page = "repolist"; |
159 | } | 158 | } |
160 | 159 | ||
161 | for(i = 0; i < sizeof(cmds)/sizeof(*cmds); i++) | 160 | for(i = 0; i < sizeof(cmds)/sizeof(*cmds); i++) |
162 | if (!strcmp(ctx->qry.page, cmds[i].name)) | 161 | if (!strcmp(ctx->qry.page, cmds[i].name)) |
163 | return &cmds[i]; | 162 | return &cmds[i]; |
164 | return NULL; | 163 | return NULL; |
165 | } | 164 | } |
diff --git a/ui-snapshot.c b/ui-snapshot.c index 9c4d086..76457d6 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c | |||
@@ -101,88 +101,98 @@ static int make_snapshot(const struct cgit_snapshot_format *format, | |||
101 | if (prefix) { | 101 | if (prefix) { |
102 | args.base = fmt("%s/", prefix); | 102 | args.base = fmt("%s/", prefix); |
103 | args.baselen = strlen(prefix) + 1; | 103 | args.baselen = strlen(prefix) + 1; |
104 | } else { | 104 | } else { |
105 | args.base = ""; | 105 | args.base = ""; |
106 | args.baselen = 0; | 106 | args.baselen = 0; |
107 | } | 107 | } |
108 | args.tree = commit->tree; | 108 | args.tree = commit->tree; |
109 | args.time = commit->date; | 109 | args.time = commit->date; |
110 | ctx.page.mimetype = xstrdup(format->mimetype); | 110 | ctx.page.mimetype = xstrdup(format->mimetype); |
111 | ctx.page.filename = xstrdup(filename); | 111 | ctx.page.filename = xstrdup(filename); |
112 | cgit_print_http_headers(&ctx); | 112 | cgit_print_http_headers(&ctx); |
113 | format->write_func(&args); | 113 | format->write_func(&args); |
114 | return 0; | 114 | return 0; |
115 | } | 115 | } |
116 | 116 | ||
117 | char *dwim_filename = NULL; | 117 | char *dwim_filename = NULL; |
118 | const char *dwim_refname = NULL; | 118 | const char *dwim_refname = NULL; |
119 | 119 | ||
120 | static int ref_cb(const char *refname, const unsigned char *sha1, int flags, | 120 | static int ref_cb(const char *refname, const unsigned char *sha1, int flags, |
121 | void *cb_data) | 121 | void *cb_data) |
122 | { | 122 | { |
123 | const char *r = refname; | 123 | const char *r = refname; |
124 | while (r && *r) { | 124 | while (r && *r) { |
125 | fprintf(stderr, " cmp %s with %s:", dwim_filename, r); | 125 | fprintf(stderr, " cmp %s with %s:", dwim_filename, r); |
126 | if (!strcmp(dwim_filename, r)) { | 126 | if (!strcmp(dwim_filename, r)) { |
127 | fprintf(stderr, "MATCH!\n"); | 127 | fprintf(stderr, "MATCH!\n"); |
128 | dwim_refname = refname; | 128 | dwim_refname = refname; |
129 | return 1; | 129 | return 1; |
130 | } | 130 | } |
131 | fprintf(stderr, "no match\n"); | 131 | fprintf(stderr, "no match\n"); |
132 | if (isdigit(*r)) | 132 | if (isdigit(*r)) |
133 | break; | 133 | break; |
134 | r++; | 134 | r++; |
135 | } | 135 | } |
136 | return 0; | 136 | return 0; |
137 | } | 137 | } |
138 | 138 | ||
139 | /* Try to guess the requested revision by combining repo name and tag name | 139 | /* Try to guess the requested revision by combining repo name and tag name |
140 | * and comparing this to the requested snapshot name. E.g. the requested | 140 | * and comparing this to the requested snapshot name. E.g. the requested |
141 | * snapshot is "cgit-0.7.2.tar.gz" while repo name is "cgit" and tag name | 141 | * snapshot is "cgit-0.7.2.tar.gz" while repo name is "cgit" and tag name |
142 | * is "v0.7.2". First, the reponame is stripped off, leaving "-0.7.2.tar.gz". | 142 | * is "v0.7.2". First, the reponame is stripped off, leaving "-0.7.2.tar.gz". |
143 | * Next, any '-' and '_' characters are stripped, leaving "0.7.2.tar.gz". | 143 | * Next, any '-' and '_' characters are stripped, leaving "0.7.2.tar.gz". |
144 | * Finally, the requested format suffix is removed and we end up with "0.7.2". | 144 | * Finally, the requested format suffix is removed and we end up with "0.7.2". |
145 | * Then we test each tag against this dwimmed filename, and for each tag | 145 | * Then we test each tag against this dwimmed filename, and for each tag |
146 | * we even try to remove any leading characters which are non-digits. I.e. | 146 | * we even try to remove any leading characters which are non-digits. I.e. |
147 | * we first compare with "v0.7.2", then with "0.7.2" and we've got a match. | 147 | * we first compare with "v0.7.2", then with "0.7.2" and we've got a match. |
148 | */ | 148 | */ |
149 | static const char *get_ref_from_filename(const char *url, const char *filename, | 149 | static const char *get_ref_from_filename(const char *url, const char *filename, |
150 | const struct cgit_snapshot_format *fmt) | 150 | const struct cgit_snapshot_format *fmt) |
151 | { | 151 | { |
152 | const char *reponame = cgit_repobasename(url); | 152 | const char *reponame = cgit_repobasename(url); |
153 | fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename); | 153 | fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename); |
154 | if (prefixcmp(filename, reponame)) | 154 | if (prefixcmp(filename, reponame)) |
155 | return NULL; | 155 | return NULL; |
156 | filename += strlen(reponame); | 156 | filename += strlen(reponame); |
157 | while (filename && (*filename == '-' || *filename == '_')) | 157 | while (filename && (*filename == '-' || *filename == '_')) |
158 | filename++; | 158 | filename++; |
159 | dwim_filename = xstrdup(filename); | 159 | dwim_filename = xstrdup(filename); |
160 | dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0'; | 160 | dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0'; |
161 | for_each_tag_ref(ref_cb, NULL); | 161 | for_each_tag_ref(ref_cb, NULL); |
162 | return dwim_refname; | 162 | return dwim_refname; |
163 | } | 163 | } |
164 | 164 | ||
165 | void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, | 165 | void cgit_print_snapshot(const char *head, const char *hex, |
166 | const char *filename, int snapshots, int dwim) | 166 | const char *filename, int snapshots, int dwim) |
167 | { | 167 | { |
168 | const struct cgit_snapshot_format* f; | 168 | const struct cgit_snapshot_format* f; |
169 | char *prefix = NULL; | ||
169 | 170 | ||
170 | f = get_format(filename); | 171 | f = get_format(filename); |
171 | if (!f) { | 172 | if (!f) { |
172 | ctx.page.mimetype = "text/html"; | 173 | ctx.page.mimetype = "text/html"; |
173 | cgit_print_http_headers(&ctx); | 174 | cgit_print_http_headers(&ctx); |
174 | cgit_print_docstart(&ctx); | 175 | cgit_print_docstart(&ctx); |
175 | cgit_print_pageheader(&ctx); | 176 | cgit_print_pageheader(&ctx); |
176 | cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); | 177 | cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); |
177 | cgit_print_docend(); | 178 | cgit_print_docend(); |
178 | return; | 179 | return; |
179 | } | 180 | } |
180 | 181 | ||
181 | if (!hex && dwim) | 182 | if (!hex && dwim) { |
182 | hex = get_ref_from_filename(ctx.repo->url, filename, f); | 183 | hex = get_ref_from_filename(ctx.repo->url, filename, f); |
184 | if (hex != NULL) { | ||
185 | prefix = xstrdup(filename); | ||
186 | prefix[strlen(filename) - strlen(f->suffix)] = '\0'; | ||
187 | } | ||
188 | } | ||
183 | 189 | ||
184 | if (!hex) | 190 | if (!hex) |
185 | hex = head; | 191 | hex = head; |
186 | 192 | ||
193 | if (!prefix) | ||
194 | prefix = xstrdup(cgit_repobasename(ctx.repo->url)); | ||
195 | |||
187 | make_snapshot(f, hex, prefix, filename); | 196 | make_snapshot(f, hex, prefix, filename); |
197 | free(prefix); | ||
188 | } | 198 | } |
diff --git a/ui-snapshot.h b/ui-snapshot.h index 3540303..b6ede52 100644 --- a/ui-snapshot.h +++ b/ui-snapshot.h | |||
@@ -1,8 +1,7 @@ | |||
1 | #ifndef UI_SNAPSHOT_H | 1 | #ifndef UI_SNAPSHOT_H |
2 | #define UI_SNAPSHOT_H | 2 | #define UI_SNAPSHOT_H |
3 | 3 | ||
4 | extern void cgit_print_snapshot(const char *head, const char *hex, | 4 | extern void cgit_print_snapshot(const char *head, const char *hex, |
5 | const char *prefix, const char *filename, | 5 | const char *filename, int snapshot, int dwim); |
6 | int snapshot, int dwim); | ||
7 | 6 | ||
8 | #endif /* UI_SNAPSHOT_H */ | 7 | #endif /* UI_SNAPSHOT_H */ |