Selaa lähdekoodia

feat: Track current version (#2731)

Lipis 4 vuotta sitten
vanhempi
commit
001880ba88
4 muutettua tiedostoa jossa 45 lisäystä ja 14 poistoa
  1. 30 13
      scripts/build-version.js
  2. 1 0
      src/constants.ts
  3. 8 1
      src/excalidraw-app/index.tsx
  4. 6 0
      src/utils.ts

+ 30 - 13
scripts/build-version.js

@@ -5,23 +5,40 @@ const path = require("path");
 const versionFile = path.join("build", "version.json");
 const indexFile = path.join("build", "index.html");
 
-const zero = (digit) => `0${digit}`.slice(-2);
-
-const versionDate = (date) => {
-  const date_ = `${date.getFullYear()}-${zero(date.getMonth() + 1)}-${zero(
-    date.getDate(),
-  )}`;
-  const time = `${zero(date.getHours())}-${zero(date.getMinutes())}-${zero(
-    date.getSeconds(),
-  )}`;
-  return `${date_}-${time}`;
+const versionDate = (date) => date.toISOString().replace(".000", "");
+
+const commitHash = () => {
+  try {
+    return require("child_process")
+      .execSync("git rev-parse --short HEAD")
+      .toString()
+      .trim();
+  } catch {
+    return "none";
+  }
 };
 
-const now = new Date();
+const commitDate = (hash) => {
+  try {
+    const unix = require("child_process")
+      .execSync(`git show -s --format=%ct ${hash}`)
+      .toString()
+      .trim();
+    const date = new Date(parseInt(unix) * 1000);
+    return versionDate(date);
+  } catch {
+    return versionDate(new Date());
+  }
+};
+
+const getFullVersion = () => {
+  const hash = commitHash();
+  return `${commitDate(hash)}-${hash}`;
+};
 
 const data = JSON.stringify(
   {
-    version: versionDate(now),
+    version: getFullVersion(),
   },
   undefined,
   2,
@@ -34,7 +51,7 @@ fs.readFile(indexFile, "utf8", (error, data) => {
   if (error) {
     return console.error(error);
   }
-  const result = data.replace(/{version}/g, versionDate(now));
+  const result = data.replace(/{version}/g, getFullVersion());
 
   fs.writeFile(indexFile, result, "utf8", (error) => {
     if (error) {

+ 1 - 0
src/constants.ts

@@ -70,6 +70,7 @@ export const DEFAULT_FONT_SIZE = 20;
 export const DEFAULT_FONT_FAMILY: FontFamily = 1;
 export const DEFAULT_TEXT_ALIGN = "left";
 export const DEFAULT_VERTICAL_ALIGN = "top";
+export const DEFAULT_VERSION = "{version}";
 
 export const CANVAS_ONLY_ACTIONS = ["selectAll"];
 

+ 8 - 1
src/excalidraw-app/index.tsx

@@ -6,6 +6,7 @@ import React, {
   useRef,
   useState,
 } from "react";
+import { trackEvent } from "../analytics";
 import { getDefaultAppState } from "../appState";
 import { ExcalidrawImperativeAPI } from "../components/App";
 import { ErrorDialog } from "../components/ErrorDialog";
@@ -22,7 +23,12 @@ import Excalidraw, {
   languages,
 } from "../packages/excalidraw/index";
 import { AppState, ExcalidrawAPIRefValue } from "../types";
-import { debounce, ResolvablePromise, resolvablePromise } from "../utils";
+import {
+  debounce,
+  getVersion,
+  ResolvablePromise,
+  resolvablePromise,
+} from "../utils";
 import { SAVE_TO_LOCAL_STORAGE_TIMEOUT } from "./app_constants";
 import CollabWrapper, { CollabAPI } from "./collab/CollabWrapper";
 import { LanguageList } from "./components/LanguageList";
@@ -223,6 +229,7 @@ function ExcalidrawWrapper(props: { collab: CollabAPI }) {
   const { collab } = props;
 
   useEffect(() => {
+    trackEvent("load", "version", getVersion());
     excalidrawRef.current!.readyPromise.then((excalidrawApi) => {
       initializeScene({
         resetScene: excalidrawApi.resetScene,

+ 6 - 0
src/utils.ts

@@ -1,6 +1,7 @@
 import colors from "./colors";
 import {
   CURSOR_TYPE,
+  DEFAULT_VERSION,
   FONT_FAMILY,
   WINDOWS_EMOJI_FALLBACK_FONT,
 } from "./constants";
@@ -361,3 +362,8 @@ export const nFormatter = (num: number, digits: number): string => {
     (num / si[index].value).toFixed(digits).replace(rx, "$1") + si[index].symbol
   );
 };
+
+export const getVersion = () => {
+  const version = document.querySelector('meta[name="version"]');
+  return version ? (version as any).content : DEFAULT_VERSION;
+};