irongit

A simpler way to view django projects

DjangoTree/src/context.ts
70 lines1.9 KBJavaScript
1import * as vscode from "vscode";
2import * as path from "path";
3import * as fs from "fs";
4import DjangoProject from "./project";
5import { djangoProjectUpdate } from "./events";
6
7export const setDjangoContext = async () => {
8 const workspaceFolders = vscode.workspace.workspaceFolders;
9 let dir = vscode.workspace
10 .getConfiguration("django-tree")
11 .get("projectDir") as string;
12 if (workspaceFolders && !dir) {
13 for (const folder of workspaceFolders) {
14 dir = folder.uri.fsPath;
15 const isDjango = await isDjangoProject(dir);
16 const inDjango = isDjango || (await isInDjangoProject(path.dirname(dir)));
17 if (isDjango || inDjango) {
18 vscode.commands.executeCommand(
19 "setContext",
20 "django-tree.projectDir",
21 dir
22 );
23 }
24 }
25 } else {
26 vscode.commands.executeCommand(
27 "setContext",
28 "django-tree.projectDir",
29 null
30 );
31 }
32 if (dir) {
33 const project = new DjangoProject(dir);
34 await project.read();
35 vscode.commands.executeCommand(
36 "setContext",
37 "django-tree.project",
38 project
39 );
40 djangoProjectUpdate.fire(project);
41 console.log("Django context set");
42 }
43};
44
45const isDjangoProject = async (dir: string): Promise<boolean> => {
46 const managePyPath = path.join(dir, "manage.py");
47 return fs.existsSync(managePyPath);
48};
49
50const isInDjangoProject = async (dir: string): Promise<boolean> => {
51 const managePyPath = path.join(dir, "manage.py");
52 if (fs.existsSync(managePyPath)) {
53 return true;
54 }
55
56 const parentDir = path.dirname(dir);
57 if (parentDir === dir) {
58 return false;
59 }
60
61 return isInDjangoProject(parentDir);
62};
63
64export const getDjangoProjectDir = (): string | undefined => {
65 return vscode.workspace.getConfiguration("django-tree").get("projectDir");
66};
67
68export const getSkipDirs = () => {
69 return vscode.workspace.getConfiguration("django-tree").get("skipDirs");
70};