ui-tree: show symlink targets in tree listing
Add links to symbolic link targets in tree listings, formatted like "ls -l". Path normalization collapses any ".." components of the link. Also fix up memory link on error path. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									cc6d9cc7fc
								
							
						
					
					
						commit
						bcffc52366
					
				
							
								
								
									
										22
									
								
								ui-tree.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								ui-tree.c
									
									
									
									
									
								
							| @ -204,9 +204,11 @@ static int ls_item(const struct object_id *oid, struct strbuf *base, | |||||||
| 	struct walk_tree_context *walk_tree_ctx = cbdata; | 	struct walk_tree_context *walk_tree_ctx = cbdata; | ||||||
| 	char *name; | 	char *name; | ||||||
| 	struct strbuf fullpath = STRBUF_INIT; | 	struct strbuf fullpath = STRBUF_INIT; | ||||||
|  | 	struct strbuf linkpath = STRBUF_INIT; | ||||||
| 	struct strbuf class = STRBUF_INIT; | 	struct strbuf class = STRBUF_INIT; | ||||||
| 	enum object_type type; | 	enum object_type type; | ||||||
| 	unsigned long size = 0; | 	unsigned long size = 0; | ||||||
|  | 	char *buf; | ||||||
| 
 | 
 | ||||||
| 	name = xstrdup(pathname); | 	name = xstrdup(pathname); | ||||||
| 	strbuf_addf(&fullpath, "%s%s%s", ctx.qry.path ? ctx.qry.path : "", | 	strbuf_addf(&fullpath, "%s%s%s", ctx.qry.path ? ctx.qry.path : "", | ||||||
| @ -218,8 +220,7 @@ static int ls_item(const struct object_id *oid, struct strbuf *base, | |||||||
| 			htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>", | 			htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>", | ||||||
| 			      name, | 			      name, | ||||||
| 			      oid_to_hex(oid)); | 			      oid_to_hex(oid)); | ||||||
| 			free(name); | 			goto cleanup; | ||||||
| 			return 0; |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -239,6 +240,21 @@ static int ls_item(const struct object_id *oid, struct strbuf *base, | |||||||
| 		cgit_tree_link(name, NULL, class.buf, ctx.qry.head, | 		cgit_tree_link(name, NULL, class.buf, ctx.qry.head, | ||||||
| 			       walk_tree_ctx->curr_rev, fullpath.buf); | 			       walk_tree_ctx->curr_rev, fullpath.buf); | ||||||
| 	} | 	} | ||||||
|  | 	if (S_ISLNK(mode)) { | ||||||
|  | 		html(" -> "); | ||||||
|  | 		buf = read_object_file(oid, &type, &size); | ||||||
|  | 		if (!buf) { | ||||||
|  | 			htmlf("Error reading object: %s", oid_to_hex(oid)); | ||||||
|  | 			goto cleanup; | ||||||
|  | 		} | ||||||
|  | 		strbuf_addbuf(&linkpath, &fullpath); | ||||||
|  | 		strbuf_addf(&linkpath, "/../%s", buf); | ||||||
|  | 		strbuf_normalize_path(&linkpath); | ||||||
|  | 		cgit_tree_link(buf, NULL, class.buf, ctx.qry.head, | ||||||
|  | 			walk_tree_ctx->curr_rev, linkpath.buf); | ||||||
|  | 		free(buf); | ||||||
|  | 		strbuf_release(&linkpath); | ||||||
|  | 	} | ||||||
| 	htmlf("</td><td class='ls-size'>%li</td>", size); | 	htmlf("</td><td class='ls-size'>%li</td>", size); | ||||||
| 
 | 
 | ||||||
| 	html("<td>"); | 	html("<td>"); | ||||||
| @ -255,6 +271,8 @@ static int ls_item(const struct object_id *oid, struct strbuf *base, | |||||||
| 		cgit_blame_link("blame", NULL, "button", ctx.qry.head, | 		cgit_blame_link("blame", NULL, "button", ctx.qry.head, | ||||||
| 				walk_tree_ctx->curr_rev, fullpath.buf); | 				walk_tree_ctx->curr_rev, fullpath.buf); | ||||||
| 	html("</td></tr>\n"); | 	html("</td></tr>\n"); | ||||||
|  | 
 | ||||||
|  | cleanup: | ||||||
| 	free(name); | 	free(name); | ||||||
| 	strbuf_release(&fullpath); | 	strbuf_release(&fullpath); | ||||||
| 	strbuf_release(&class); | 	strbuf_release(&class); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user