Browse Source

Better subtree scripts (#25)

* Replace local subtree cache with git log checks

* Nevermind, use git's subtree split --rejoin method

* Make notifications temporary again

* Revert "Nevermind, use git's subtree split --rejoin method"

This reverts commit a96e8734ec75c95a980214fdebfc6f201a82afcf.

* Add commit hashes of upstream before split

* Rewrite subtree scripts in python

* Use cached commit hash from gitsubtree file

* Save new cached hash when updating/adding subtrees

* Add back notifications

* Commit amend after new cache is added

* Add missing cache commits

* Sort subtrees when updating

* Fix gitignore
WillyJL 1 year ago
parent
commit
1864a26b28
100 changed files with 418 additions and 316 deletions
  1. 1 1
      .gitignore
  2. 89 0
      .subtrees/add.py
  3. 154 0
      .subtrees/common.py
  4. 59 0
      .subtrees/update.py
  5. 0 29
      .utils/.check-merge.sh
  6. 0 15
      .utils/.check-workdir.sh
  7. 0 63
      .utils/.subtree-subdir-helper.sh
  8. 0 60
      .utils/add-subtree.sh
  9. 0 33
      .utils/update-subtrees.sh
  10. 1 1
      2048/.gitsubtree
  11. 1 1
      4inrow/.gitsubtree
  12. 5 5
      README.md
  13. 2 2
      air_arkanoid/.gitsubtree
  14. 2 2
      air_labyrinth/.gitsubtree
  15. 1 1
      airmouse/.gitsubtree
  16. 1 1
      arkanoid/.gitsubtree
  17. 1 1
      asteroids/.gitsubtree
  18. 2 2
      atomicdiceroller/.gitsubtree
  19. 2 2
      avr_isp/.gitsubtree
  20. 1 1
      barcode_gen/.gitsubtree
  21. 1 1
      blackjack/.gitsubtree
  22. 1 1
      bomberduck/.gitsubtree
  23. 1 1
      bpmtapper/.gitsubtree
  24. 1 1
      bt_trigger/.gitsubtree
  25. 1 1
      caesarcipher/.gitsubtree
  26. 1 1
      calculator/.gitsubtree
  27. 2 2
      camera_suite/.gitsubtree
  28. 1 1
      chess/.gitsubtree
  29. 1 1
      cli_bridge/.gitsubtree
  30. 1 1
      cntdown_timer/.gitsubtree
  31. 1 1
      color_guess/.gitsubtree
  32. 1 1
      counter/.gitsubtree
  33. 2 2
      dap_link/.gitsubtree
  34. 1 1
      doom/.gitsubtree
  35. 1 1
      dtmf_dolphin/.gitsubtree
  36. 1 1
      em4100_generator/.gitsubtree
  37. 1 1
      esp8266_deauth/.gitsubtree
  38. 1 1
      esp_flasher/.gitsubtree
  39. 1 1
      esubghz_chat/.gitsubtree
  40. 2 2
      etch_a_sketch/.gitsubtree
  41. 1 1
      ethernet/.gitsubtree
  42. 2 2
      evil_portal/.gitsubtree
  43. 1 1
      flappy_bird/.gitsubtree
  44. 1 1
      flashlight/.gitsubtree
  45. 1 1
      flipbip/.gitsubtree
  46. 1 1
      flizzer_tracker/.gitsubtree
  47. 2 2
      fmf_to_sub/.gitsubtree
  48. 1 1
      game15/.gitsubtree
  49. 1 1
      game_of_life/.gitsubtree
  50. 2 2
      geiger/.gitsubtree
  51. 1 1
      gpio_badge/.gitsubtree
  52. 1 1
      gpio_controller/.gitsubtree
  53. 1 1
      gpio_reader_a/.gitsubtree
  54. 1 1
      gpio_reader_b/.gitsubtree
  55. 1 1
      gps_nmea/.gitsubtree
  56. 1 1
      hc_sr04/.gitsubtree
  57. 1 1
      heap_defence/.gitsubtree
  58. 1 1
      hex_editor/.gitsubtree
  59. 1 1
      hex_viewer/.gitsubtree
  60. 1 1
      i2ctools/.gitsubtree
  61. 2 2
      ifttt/.gitsubtree
  62. 1 1
      ir_intervalometer/.gitsubtree
  63. 1 1
      ir_remote/.gitsubtree
  64. 1 1
      ir_scope/.gitsubtree
  65. 1 1
      jetpack_joyride/.gitsubtree
  66. 1 1
      key_copier/.gitsubtree
  67. 2 2
      lightmeter/.gitsubtree
  68. 1 1
      magspoof/.gitsubtree
  69. 1 1
      malveke_gb_cartridge/.gitsubtree
  70. 1 1
      malveke_gb_emulator/.gitsubtree
  71. 1 1
      malveke_gb_link_camera/.gitsubtree
  72. 1 1
      malveke_gb_live_camera/.gitsubtree
  73. 1 1
      malveke_gb_photo/.gitsubtree
  74. 1 1
      malveke_gba_cartridge/.gitsubtree
  75. 1 1
      malveke_pin_test/.gitsubtree
  76. 2 2
      mass_storage/.gitsubtree
  77. 1 1
      mayhem_camera/.gitsubtree
  78. 1 1
      mayhem_marauder/.gitsubtree
  79. 1 1
      mayhem_morseflash/.gitsubtree
  80. 1 1
      mayhem_motion/.gitsubtree
  81. 1 1
      mayhem_nannycam/.gitsubtree
  82. 1 1
      mayhem_qrcode/.gitsubtree
  83. 1 1
      meal_pager/.gitsubtree
  84. 1 1
      metronome/.gitsubtree
  85. 2 2
      mfc_editor/.gitsubtree
  86. 3 3
      mfkey/.gitsubtree
  87. 1 1
      mifare_fuzzer/.gitsubtree
  88. 1 1
      minesweeper/.gitsubtree
  89. 1 1
      morse_code/.gitsubtree
  90. 1 1
      multi_converter/.gitsubtree
  91. 2 2
      music_player/.gitsubtree
  92. 2 2
      nfc_magic/.gitsubtree
  93. 1 1
      nfc_playlist/.gitsubtree
  94. 2 2
      nfc_rfid_detector/.gitsubtree
  95. 1 1
      nightstand_clock/.gitsubtree
  96. 1 1
      nrf24batch/.gitsubtree
  97. 2 2
      nrf24channelscanner/.gitsubtree
  98. 1 1
      nrf24mousejacker/.gitsubtree
  99. 1 1
      nrf24scan/.gitsubtree
  100. 1 1
      nrf24sniff/.gitsubtree

+ 1 - 1
.gitignore

@@ -1,3 +1,3 @@
 /.vscode/
 /.vscode/
 /venv/
 /venv/
-.subtree-cache/
+__pycache__/

+ 89 - 0
.subtrees/add.py

@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+import tempfile
+import pathlib
+import shutil
+import sys
+import re
+
+import common
+
+
+def print_usage_and_exit():
+    print("Usage 1: <path> <repo url> <branch> [subdir]")
+    print("Usage 2: <path> <repo url>/tree/<branch>[/subdir]")
+    sys.exit(1)
+
+
+if __name__ == "__main__":
+    common.check_workdir_state()
+
+    if len(sys.argv) < 3 or not sys.argv[1] or not sys.argv[2]:
+        print_usage_and_exit()
+
+    if len(sys.argv) == 3 and "/tree/" not in sys.argv[2]:
+        print_usage_and_exit()
+
+    path = sys.argv[1]
+    repo = sys.argv[2].strip("/")
+    if len(sys.argv) == 3:
+        res = re.match(r"(https?://[^/]+/[^/]+/[^/]+)/tree/([^/]+)/?(.*)", repo)
+        if not res:
+            print(f"Could not parse repo URL: {repo}")
+            sys.exit(1)
+        repo = res.group(1)
+        branch = res.group(2)
+        subdir = res.group(3).strip("/")
+    else:
+        branch = sys.argv[3]
+        if len(sys.argv) > 4:
+            subdir = sys.argv[4].strip("/")
+        else:
+            subdir = ""
+    gitsubtree = common.REPO_ROOT / path / ".gitsubtree"
+
+    prevremotedir = None
+    if gitsubtree.is_file():
+        print("Subtree already exists, adding new remote to it.")
+        prevremotedir = pathlib.Path(tempfile.mkdtemp(prefix="gitsubtree"))
+        # To use 2 remotes for subtree we need to remove current one, add new one, then merge
+        shutil.move(path, prevremotedir / path)
+        common.git("add", path)
+        common.git("commit", "-m", f"Add new remote for {path}")
+
+    if subdir == "":
+        subdir = "/"
+        common.git(
+            "subtree",
+            "add",
+            "-P",
+            path,
+            repo,
+            branch,
+            "-m",
+            f"Add {path} from {repo}",
+        )
+        commit = None
+    else:
+        commit = common.subdir_split_helper(path, repo, branch, subdir, "add")
+
+    if prevremotedir:
+        shutil.rmtree(path)
+        shutil.move(prevremotedir / path, path)
+        prevremotedir.rmdir()
+
+    line = f"{repo} {branch} {subdir}" + (f" {commit}" if commit else "")
+    if gitsubtree.is_file():
+        # Add new remote at the top
+        lines = gitsubtree.read_text().splitlines()
+        lines.insert(0, line)
+    else:
+        lines = [line]
+    gitsubtree.write_text("\n".join(lines) + "\n")
+    common.git("add", str(gitsubtree.relative_to(common.REPO_ROOT)))
+    common.git("commit", "--amend", "--no-edit")
+
+    if prevremotedir:
+        prevremotedir = None
+        print(
+            "Added new remote for existing subtree, you must resolve conflicts manually..."
+        )

+ 154 - 0
.subtrees/common.py

@@ -0,0 +1,154 @@
+import subprocess
+import pathlib
+import time
+import sys
+
+REPO_ROOT = pathlib.Path(__file__).parent.parent
+
+
+def git(*args, pipe=False, tee=False):
+    if tee:
+        result = b""
+        line = b""
+        with subprocess.Popen(
+            ["git", *args],
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT,
+            bufsize=0,
+        ) as proc:
+            cr = False
+            while True:
+                char = proc.stdout.read(1)
+                if not char:
+                    result += line
+                    break
+                sys.stdout.write(char.decode())
+                # Simulate terminal line buffering, where \r resets to start of line overwriting what is already there
+                # unless \n follows it, which is just going to next line keeping the content on previous one
+                # Useful for terminal progress bars/numbers, no need to log all this data as separate lines
+                if char == b"\r":
+                    cr = True
+                    continue
+                elif cr:
+                    cr = False
+                    if char != b"\n":
+                        line = b""
+                line += char
+                if char == b"\n":
+                    result += line
+                    line = b""
+        return result.decode().removesuffix("\n"), proc.returncode
+
+    elif pipe:
+        return subprocess.check_output(["git", *args], text=True).removesuffix("\n")
+
+    else:
+        return subprocess.check_call(["git", *args])
+
+
+def is_workdir_clean():
+    try:
+        git("diff", "--quiet")
+        git("diff", "--cached", "--quiet")
+        git("merge", "HEAD", pipe=True)
+        return True
+    except subprocess.CalledProcessError:
+        return False
+
+
+def send_alert(title, message):
+    try:
+        subprocess.run(
+            ["notify-send", "-a", "Git", "-i", "git", title, message],
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+        )
+    except Exception:
+        pass
+
+
+def check_merge_result(path, repo, result, status):
+    if "Automatic merge failed; fix conflicts and then commit the result." in result:
+        print(f"MERGE_MSG: Merge {path} from {repo}")
+        send_alert("Subtree merge failed", "Resolve current index to continue")
+        while True:
+            input("Resolve current index then press Enter...")
+            if is_workdir_clean():
+                break
+            time.sleep(1)
+
+    elif (
+        "Please commit your changes or stash them before you switch branches." in result
+    ):
+        sys.exit(1)
+
+    elif "fatal: " in result:
+        sys.exit(1)
+
+    elif status != 0:
+        print(f"Git returned status: {status}")
+        sys.exit(1)
+
+
+def check_workdir_state():
+    if git("rev-parse", "--show-prefix", pipe=True) != "":
+        print("Must be in root of git repo!")
+        sys.exit(1)
+
+    if git("branch", "--show-current", pipe=True) == "":
+        print("Must be on a branch!")
+        sys.exit(1)
+
+    if not is_workdir_clean():
+        print("Workdir must be clean!")
+        sys.exit(1)
+
+
+def subdir_split_helper(path, repo, branch, subdir, action, cached=None):
+    check_workdir_state()
+
+    prevbranch = git("branch", "--show-current", pipe=True)
+    temp = "/".join(repo.split("/")[-2:] + [branch]).replace("/", "-")
+    fetch = f"_fetch-{temp}"
+    split = f"_split-{temp}-{subdir.replace('/', '-')}"
+    git("fetch", "--no-tags", repo, f"{branch}:{fetch}")
+
+    current = git("rev-parse", fetch, pipe=True)
+    skip = False
+    if cached:
+        try:
+            git("diff", "--quiet", cached, current, "--", subdir)
+            skip = True
+        except subprocess.CalledProcessError:
+            pass
+    if skip:
+        print("No updates, skipping expensive subtree split.")
+        return
+
+    ok = True
+    git("checkout", fetch)
+    result, status = git("subtree", "split", "-P", subdir, "-b", split, tee=True)
+    if "is not an ancestor of commit" in result:
+        print("Resetting split branch...")
+        git("branch", "-D", split)
+        git("subtree", "split", "-P", subdir, "-b", split)
+    if "fatal: " in result:
+        ok = False
+    git("checkout", prevbranch)
+    if ok:
+        prevhead = git("rev-parse", "HEAD", pipe=True)
+        result, status = git(
+            "subtree",
+            action,
+            "-P",
+            path,
+            split,
+            "-m",
+            f"{action.title()} {path} from {repo}",
+            tee=True,
+        )
+        check_merge_result(path, repo, result, status)
+        if git("rev-parse", "HEAD", pipe=True) != prevhead:
+            # Only return new upstream hash if subtree was updated
+            # Not if merge was aborted or nothing to update
+            return current

+ 59 - 0
.subtrees/update.py

@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+import pathlib
+import sys
+
+import common
+
+
+if __name__ == "__main__":
+    common.check_workdir_state()
+
+    if len(sys.argv) > 1:
+        subtrees = sys.argv[1:]
+    else:
+        subtrees = sorted(list(common.REPO_ROOT.glob("**/.gitsubtree")))
+
+    for subtree in subtrees:
+        if not isinstance(subtree, pathlib.Path):
+            if not subtree.endswith("/.gitsubtree"):
+                subtree += "/.gitsubtree"
+            subtree = common.REPO_ROOT / subtree
+        path = str(subtree.parent.relative_to(common.REPO_ROOT))
+        print(f"\n\nUpdating {path}...")
+
+        for remote in subtree.read_text().splitlines():
+            if remote.startswith("#"):
+                continue
+            params = remote.split(" ")
+            if len(params) == 4:
+                repo, branch, subdir, cached = params
+            else:
+                repo, branch, subdir = params
+            if subdir == "/":
+                result, status = common.git(
+                    "subtree",
+                    "pull",
+                    "-P",
+                    path,
+                    repo,
+                    branch,
+                    "-m",
+                    f"Merge {path} from {repo}",
+                    tee=True,
+                )
+                common.check_merge_result(path, repo, result, status)
+            else:
+                commit = common.subdir_split_helper(
+                    path, repo, branch, subdir, "merge", cached=cached
+                )
+                if commit:
+                    lines = subtree.read_text().splitlines()
+                    for i in range(len(lines)):
+                        if lines[i].startswith(repo):
+                            lines[i] = f"{repo} {branch} {subdir} {commit}"
+                            break
+                    subtree.write_text("\n".join(lines) + "\n")
+                    common.git("add", str(subtree.relative_to(common.REPO_ROOT)))
+                    common.git("commit", "--amend", "--no-edit")
+
+    common.send_alert("Subtree update finished", "Double check merge commits")

+ 0 - 29
.utils/.check-merge.sh

@@ -1,29 +0,0 @@
-#!/bin/bash
-set -e
-
-if [ "${1}" = "" ] || [ "${2}" = "" ]; then
-    echo "Usage: <path> <repo url> <merge output>"
-    exit
-fi
-path="${1}"
-repo="${2}"
-result="${3}"
-
-if grep "Automatic merge failed; fix conflicts and then commit the result." <<< "$result" > /dev/null; then
-    echo "MERGE_MSG: Merge ${path} from ${repo}"
-    notify-send -t 0 -a Git -i git "Subtree merge failed" "Resolve current index to continue" &> /dev/null | true
-    while true; do
-        echo "Resolve current index then press Enter..."
-        read
-        if git diff --quiet && git diff --cached --quiet && git merge HEAD &> /dev/null; then
-            break
-        fi
-        sleep 1
-    done
-fi
-if grep "Please commit your changes or stash them before you switch branches." <<< "$result" > /dev/null; then
-    exit 1
-fi
-if grep "^fatal: " <<< "$result" > /dev/null; then
-    exit 1
-fi

+ 0 - 15
.utils/.check-workdir.sh

@@ -1,15 +0,0 @@
-#!/bin/bash
-set -e
-
-if [ "$(git rev-parse --show-prefix)" != "" ]; then
-    echo "Must be in root of git repo!"
-    exit 1
-fi
-if [ "$(git branch --show-current)" = "" ]; then
-    echo "Must be on a branch!"
-    exit 1
-fi
-if ! git diff --quiet || ! git diff --cached --quiet || ! git merge HEAD &> /dev/null; then
-    echo "Workdir must be clean!"
-    exit 1
-fi

+ 0 - 63
.utils/.subtree-subdir-helper.sh

@@ -1,63 +0,0 @@
-#!/bin/bash
-set -e
-
-bash .utils/.check-workdir.sh
-
-if [ "${1}" = "" ] || [ "${2}" = "" ] || [ "${3}" = "" ] || [ "${4}" = "" ] || [ "${5}" = "" ]; then
-    echo "Usage: <path> <repo url> <branch> <subdir> <action>"
-    exit
-fi
-path="${1}"
-repo="${2}"
-branch="${3}"
-subdir="${4}"
-action="${5}"
-
-prevbranch="$(git branch --show-current)"
-temp="$(rev <<< "${repo%/}" | cut -d/ -f1,2 | rev | tr / -)-$(tr / - <<< "${branch}")"
-fetch="_fetch-${temp}"
-split="_split-${temp}-$(tr / - <<< "${subdir}")"
-git fetch --no-tags "${repo}" "${branch}:${fetch}"
-cache="${path}/.subtree-cache/${split}"
-hash="$(git rev-parse ${fetch})"
-skip=false
-if [ -f "${cache}" ]; then
-    if git diff --quiet "$(<${cache})" "${hash}" -- "${subdir}"; then
-        skip=true
-    fi
-fi
-ok=true
-if $skip; then
-    echo "No updates, skipping expensive subtree split."
-else
-    git checkout "${fetch}"
-    exec {capture}>&1
-    result="$(git subtree split -P "${subdir}" -b "${split}" 2>&1 | tee /proc/self/fd/$capture)"
-    if grep "is not an ancestor of commit" <<< "$result" > /dev/null; then
-        echo "Resetting split branch..."
-        git branch -D "${split}"
-        git subtree split -P "${subdir}" -b "${split}"
-    fi
-    if grep "^fatal: " <<< "$result" > /dev/null; then
-        ok=false
-    fi
-    git checkout "${prevbranch}"
-    if $ok; then
-        prevhead="$(git rev-parse HEAD)"
-        exec {capture}>&1
-        result="$(git subtree "${action}" -P "${path}" "${split}" -m "${action^} ${path} from ${repo}" 2>&1 | tee /proc/self/fd/$capture)"
-        cleanmerge=false
-        if git diff --quiet && git diff --cached --quiet && git merge HEAD &> /dev/null; then
-            cleanmerge=true
-        fi
-        bash .utils/.check-merge.sh "${path}" "${repo}" "${result}"
-        if [ "${prevhead}" = "$(git rev-parse HEAD)" ] && ! $cleanmerge; then
-            # Not a clean merge, and merge was aborted, don't save cache
-            ok=false
-        fi
-    fi
-fi
-if $ok; then
-    mkdir -p "${path}/.subtree-cache"
-    echo "${hash}" > "${cache}"
-fi

+ 0 - 60
.utils/add-subtree.sh

@@ -1,60 +0,0 @@
-#!/bin/bash
-set -e
-
-bash .utils/.check-workdir.sh
-
-if [ "$1" = "" ] || [ "$2" = "" ]; then
-    echo "Usage 1: <path> <repo url> <branch> [subdir]"
-    echo "Usage 2: <path> <repo url>/tree/<branch>[/subdir]"
-    exit
-fi
-path="${1%/}"
-repo="${2%/}"
-if [ "$3" = "" ]; then
-    read repo branch subdir <<< "$(sed -E "s|(https?://[^/]+)/([^/]+)/([^/]+)/(tree\|blob)/([^/]+)/?(.*)|\1/\2/\3 \5 \6|" <<< "${repo}")"
-else
-    branch="${3}"
-    subdir="${4%/}"
-fi
-gitsubtree="${path}/.gitsubtree"
-
-prevremotedir=""
-if [ -e "${gitsubtree}" ]; then
-    echo "Subtree already exists, adding new remote to it."
-    prevremotedir="$(mktemp -d /tmp/gitsubtree-XXXXXXXX)"
-    # To use 2 remotes for subtree we need to remove current one, add new one, then merge
-    mv -T "${path}" "${prevremotedir}"
-    git add "${path}"
-    git commit -m "Add new remote for ${path}"
-fi
-
-if [ "${subdir}" = "" ]; then
-    subdir="/"
-    git subtree add -P "${path}" "${repo}" "${branch}" -m "Add ${path} from ${repo}"
-else
-    bash .utils/.subtree-subdir-helper.sh "${path}" "${repo}" "${branch}" "${subdir}" add
-fi
-
-if [ "${prevremotedir}" != "" ]; then
-    if [ -e "${path}/.subtree-cache" ]; then
-        # Backup subtree cache
-        cp -rT "${path}/.subtree-cache" "${prevremotedir}/.subtree-cache"
-    fi
-    rm -r "${path}"
-    mv -T "${prevremotedir}" "${path}"
-fi
-
-if [ -e "${gitsubtree}" ]; then
-    # Add new remote at the top
-    echo "${repo} ${branch} ${subdir}" | cat - "${gitsubtree}" > "${gitsubtree}.new"
-    mv "${gitsubtree}.new" "${gitsubtree}"
-else
-    echo "${repo} ${branch} ${subdir}" > "${gitsubtree}"
-fi
-git add "${gitsubtree}"
-git commit --amend --no-edit
-
-if [ "${prevremotedir}" != "" ]; then
-    prevremotedir=""
-    echo "Added new remote for existing subtree, you must solve conflicts manually..."
-fi

+ 0 - 33
.utils/update-subtrees.sh

@@ -1,33 +0,0 @@
-#!/bin/bash
-set -e
-
-bash .utils/.check-workdir.sh
-
-if [ "${1}" = "" ]; then
-    shopt -s globstar
-    subtrees=(**/.gitsubtree)
-else
-    subtrees=($*)
-fi
-
-for subtree in "${subtrees[@]}"; do
-    if [[ "${subtree}" != */.gitsubtree ]]; then
-        subtree="${subtree}/.gitsubtree"
-    fi
-    path="$(dirname "${subtree}")"
-    echo -e "\n\nUpdating ${path}..."
-    while read -u $remote repo branch subdir; do
-        if [ "${repo:0:1}" = "#" ]; then
-            continue
-        fi
-        if [ "${subdir}" = "/" ]; then
-            exec {capture}>&1
-            result="$(git subtree pull -P "${path}" "${repo}" "${branch}" -m "Merge ${path} from ${repo}" 2>&1 | tee /proc/self/fd/$capture)"
-            bash .utils/.check-merge.sh "${path}" "${repo}" "${result}"
-        else
-            bash .utils/.subtree-subdir-helper.sh "${path}" "${repo}" "${branch}" "${subdir}" merge
-        fi
-    done {remote}< "${subtree}"
-done
-
-notify-send -t 0 -a Git -i git "Subtree update finished" "Double check merge commits" &> /dev/null | true

+ 1 - 1
2048/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/game_2048
+https://github.com/xMasterX/all-the-plugins dev base_pack/game_2048 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/eugene-kirzhanov/flipper-zero-2048-game main /
 https://github.com/eugene-kirzhanov/flipper-zero-2048-game main /

+ 1 - 1
4inrow/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/4inrow_game
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/4inrow_game 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/leo-need-more-coffee/flipperzero-4inrow main /
 https://github.com/leo-need-more-coffee/flipperzero-4inrow main /

+ 5 - 5
README.md

@@ -26,13 +26,13 @@ We didn't want to have fork repos for each single app since it would get out of
 Subtrees work in a very peculiar way: they pull and compare commit history from a remote repo and apply it to a subdirectory of this repo.
 Subtrees work in a very peculiar way: they pull and compare commit history from a remote repo and apply it to a subdirectory of this repo.
 That's why the commit history for this repo is so huge, it contains all the commits for all the apps, plus our edits.
 That's why the commit history for this repo is so huge, it contains all the commits for all the apps, plus our edits.
 
 
-To make updating more manageable, we have added some scripts on top of subtrees:
-- add a new app with `.utils/add-subtree.sh <path> <repo url> <branch> [subdir]`, this will pull the history and create `path/.gitsubtree` to remember the url, branch and subdir
-- run `.utils/update-subtrees.sh <path> [path2] [pathN...]` to pull updates for some subtrees
-- or run `.utils/update-subtrees.sh` with no arguments to update all subtrees
+To make updating more manageable, we have added some scripts on top of subtrees (requires [Python](https://python.org) installed to use):
+- add a new app with `.subtrees/add.py <path> <repo url> <branch> [subdir]`, this will pull the history and create `path/.gitsubtree` to remember the url, branch and subdir
+- run `.subtrees/update.py <path> [path2] [pathN...]` to pull updates for some subtrees
+- or run `.subtrees/update.py` with no arguments to update all subtrees
 
 
 Most apps have a remote subtree URL for both the original repository, and for any forks / other sources such as [@xMasterX's pack](https://github.com/xMasterX/all-the-plugins).
 Most apps have a remote subtree URL for both the original repository, and for any forks / other sources such as [@xMasterX's pack](https://github.com/xMasterX/all-the-plugins).
-This process is assisted by `.utils/add-subtree.sh`, if the specified subtree path already exists, it will:
+This process is assisted by `.subtrees/add.py`, if the specified subtree path already exists, it will:
 - remove the previous subtree with a commit
 - remove the previous subtree with a commit
 - add the subtree from the new remote
 - add the subtree from the new remote
 - restore the previous subtree and merge the remotes
 - restore the previous subtree and merge the remotes

+ 2 - 2
air_arkanoid/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/air_arkanoid
-https://github.com/flipperdevices/flipperzero-good-faps dev air_arkanoid
+https://github.com/xMasterX/all-the-plugins dev base_pack/air_arkanoid 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/flipperdevices/flipperzero-good-faps dev air_arkanoid b791dea234f855155027bb46215dc60f3ddeb243

+ 2 - 2
air_labyrinth/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/air_labyrinth
-https://github.com/jamisonderek/flipper-zero-tutorials main vgm/apps/air_labyrinth
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/air_labyrinth 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/jamisonderek/flipper-zero-tutorials main vgm/apps/air_labyrinth ae42dc8f84f211002f13d37f49526194e6b599d7

+ 1 - 1
airmouse/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/airmouse
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/airmouse 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/ginkage/FlippAirMouse/ main /
 https://github.com/ginkage/FlippAirMouse/ main /

+ 1 - 1
arkanoid/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/arkanoid
+https://github.com/xMasterX/all-the-plugins dev base_pack/arkanoid 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
asteroids/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/flipper-asteroids
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/flipper-asteroids 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/SimplyMinimal/FlipperZero-Asteroids main /
 https://github.com/SimplyMinimal/FlipperZero-Asteroids main /

+ 2 - 2
atomicdiceroller/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flipper_atomicdiceroller
-https://github.com/nmrr/flipperzero-atomicdiceroller main flipper_atomicdiceroller
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flipper_atomicdiceroller 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/nmrr/flipperzero-atomicdiceroller main flipper_atomicdiceroller f222880d23ba031cfe8fc151d951415b315db995

+ 2 - 2
avr_isp/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/avr_isp_programmer
-https://github.com/flipperdevices/flipperzero-good-faps dev avr_isp_programmer
+https://github.com/xMasterX/all-the-plugins dev base_pack/avr_isp_programmer 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/flipperdevices/flipperzero-good-faps dev avr_isp_programmer b791dea234f855155027bb46215dc60f3ddeb243

+ 1 - 1
barcode_gen/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/barcode_gen
+https://github.com/xMasterX/all-the-plugins dev base_pack/barcode_gen 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/Kingal1337/flipper-barcode-generator master /
 https://github.com/Kingal1337/flipper-barcode-generator master /

+ 1 - 1
blackjack/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/blackjack
+https://github.com/xMasterX/all-the-plugins dev base_pack/blackjack 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/doofy-dev/flipper_blackjack main /
 https://github.com/doofy-dev/flipper_blackjack main /

+ 1 - 1
bomberduck/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/bomberduck
+https://github.com/xMasterX/all-the-plugins dev base_pack/bomberduck 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/leo-need-more-coffee/flipperzero-bomberduck main /
 https://github.com/leo-need-more-coffee/flipperzero-bomberduck main /

+ 1 - 1
bpmtapper/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/bpmtapper
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/bpmtapper 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/ezod/flipperzero-bpm-tapper main /
 https://github.com/ezod/flipperzero-bpm-tapper main /

+ 1 - 1
bt_trigger/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/bluetooth-trigger
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/bluetooth-trigger 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/Nem0oo/flipper-zero-bluetooth-trigger main /
 https://github.com/Nem0oo/flipper-zero-bluetooth-trigger main /

+ 1 - 1
caesarcipher/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/caesarcipher
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/caesarcipher 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/panki27/caesar-cipher master /
 https://github.com/panki27/caesar-cipher master /

+ 1 - 1
calculator/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/calculator
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/calculator 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 2 - 2
camera_suite/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/camera_suite
-https://github.com/CodyTolene/Flipper-Zero-Camera-Suite main fap
+https://github.com/xMasterX/all-the-plugins dev base_pack/camera_suite 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/CodyTolene/Flipper-Zero-Camera-Suite main fap 184f52a3283eb61b61eacd470424a8d7619f6922

+ 1 - 1
chess/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/chess
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/chess 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/xtruan/flipper-chess main /
 https://github.com/xtruan/flipper-chess main /

+ 1 - 1
cli_bridge/.gitsubtree

@@ -1,2 +1,2 @@
 https://github.com/ranchordo/flipperzero-cli-bridge main /
 https://github.com/ranchordo/flipperzero-cli-bridge main /
-#https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/cli_bridge
+#https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/cli_bridge 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
cntdown_timer/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/fpz_cntdown_timer-main
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/fpz_cntdown_timer-main 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/0w0mewo/fpz_cntdown_timer main /
 https://github.com/0w0mewo/fpz_cntdown_timer main /

+ 1 - 1
color_guess/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/color_guess
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/color_guess 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/leedave/flipper-zero-color-guess main /
 https://github.com/leedave/flipper-zero-color-guess main /

+ 1 - 1
counter/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/counter
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/counter 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/Krulknul/dolphin-counter main /
 https://github.com/Krulknul/dolphin-counter main /

+ 2 - 2
dap_link/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/dap_link
-https://github.com/flipperdevices/flipperzero-good-faps dev dap_link
+https://github.com/xMasterX/all-the-plugins dev base_pack/dap_link 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/flipperdevices/flipperzero-good-faps dev dap_link b791dea234f855155027bb46215dc60f3ddeb243

+ 1 - 1
doom/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/doom
+https://github.com/xMasterX/all-the-plugins dev base_pack/doom 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
dtmf_dolphin/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/dtmf_dolphin
+https://github.com/xMasterX/all-the-plugins dev base_pack/dtmf_dolphin 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/litui/dtmf_dolphin main /
 https://github.com/litui/dtmf_dolphin main /

+ 1 - 1
em4100_generator/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/fz-em4100-generator
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/fz-em4100-generator 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/Milk-Cool/fz-em4100-generator main /
 https://github.com/Milk-Cool/fz-em4100-generator main /

+ 1 - 1
esp8266_deauth/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/esp8266_deauth
+https://github.com/xMasterX/all-the-plugins dev base_pack/esp8266_deauth 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
esp_flasher/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/esp_flasher
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/esp_flasher 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/0xchocolate/flipperzero-esp-flasher main /
 https://github.com/0xchocolate/flipperzero-esp-flasher main /

+ 1 - 1
esubghz_chat/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/esubghz_chat
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/esubghz_chat 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/twisted-pear/esubghz_chat main /
 https://github.com/twisted-pear/esubghz_chat main /

+ 2 - 2
etch_a_sketch/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/etch-a-sketch
-https://github.com/SimplyMinimal/FlipperZero-Etch-A-Sketch main etch-a-sketch
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/etch-a-sketch 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/SimplyMinimal/FlipperZero-Etch-A-Sketch main etch-a-sketch c25b81c4c6d073625724cedb8ef38826403c10a8

+ 1 - 1
ethernet/.gitsubtree

@@ -1,3 +1,3 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/eth_troubleshooter
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/eth_troubleshooter 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/arag0re/fz-eth-troubleshooter master /
 https://github.com/arag0re/fz-eth-troubleshooter master /
 https://github.com/karasevia/finik_eth main /
 https://github.com/karasevia/finik_eth main /

+ 2 - 2
evil_portal/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flipper_evil_portal
-https://github.com/leedave/flipper-zero-evil-portal leedave/ap_rename flipper/flipper-evil-portal
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flipper_evil_portal 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/leedave/flipper-zero-evil-portal leedave/ap_rename flipper/flipper-evil-portal 735b84d6d24578551fe92d69657899350800db1a

+ 1 - 1
flappy_bird/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/flappy_bird
+https://github.com/xMasterX/all-the-plugins dev base_pack/flappy_bird 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
flashlight/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/flipper-flashlight
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/flipper-flashlight 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/xMasterX/flipper-flashlight main /
 https://github.com/xMasterX/flipper-flashlight main /

+ 1 - 1
flipbip/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/FlipBIP
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/FlipBIP 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/xtruan/FlipBIP main /
 https://github.com/xtruan/FlipBIP main /

+ 1 - 1
flizzer_tracker/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flizzer_tracker
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flizzer_tracker 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/LTVA1/flizzer_tracker main /
 https://github.com/LTVA1/flizzer_tracker main /

+ 2 - 2
fmf_to_sub/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/fmf_to_sub
-https://github.com/jamisonderek/flipper-zero-tutorials main subghz/fmf_to_sub
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/fmf_to_sub 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/jamisonderek/flipper-zero-tutorials main subghz/fmf_to_sub ae42dc8f84f211002f13d37f49526194e6b599d7

+ 1 - 1
game15/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/game15
+https://github.com/xMasterX/all-the-plugins dev base_pack/game15 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/x27/flipperzero-game15 main /
 https://github.com/x27/flipperzero-game15 main /

+ 1 - 1
game_of_life/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/game_of_life
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/game_of_life 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 2 - 2
geiger/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/flipper_geiger
-https://github.com/nmrr/flipperzero-geigercounter main flipper_geiger
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/flipper_geiger 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/nmrr/flipperzero-geigercounter main flipper_geiger 4940ce4fb01e0d539f6695dc7286492ca71407d0

+ 1 - 1
gpio_badge/.gitsubtree

@@ -1 +1 @@
-https://github.com/jamisonderek/flipper-zero-tutorials main gpio/gpio_badge
+https://github.com/jamisonderek/flipper-zero-tutorials main gpio/gpio_badge ae42dc8f84f211002f13d37f49526194e6b599d7

+ 1 - 1
gpio_controller/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/gpio_controller
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/gpio_controller 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/Lokno/gpio_controller main /
 https://github.com/Lokno/gpio_controller main /

+ 1 - 1
gpio_reader_a/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/gpio_pins_reader
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/gpio_pins_reader 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/aureli1c/flipperzero_GPIO_read main /
 https://github.com/aureli1c/flipperzero_GPIO_read main /

+ 1 - 1
gpio_reader_b/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flipperzero_gpioreader
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/flipperzero_gpioreader 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/biotinker/flipperzero-gpioreader main /
 https://github.com/biotinker/flipperzero-gpioreader main /

+ 1 - 1
gps_nmea/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/gps_nmea_uart
+https://github.com/xMasterX/all-the-plugins dev base_pack/gps_nmea_uart 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/ezod/flipperzero-gps main /
 https://github.com/ezod/flipperzero-gps main /

+ 1 - 1
hc_sr04/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/hc_sr04
+https://github.com/xMasterX/all-the-plugins dev base_pack/hc_sr04 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
heap_defence/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/heap_defence_game
+https://github.com/xMasterX/all-the-plugins dev base_pack/heap_defence_game 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
hex_editor/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/hex_editor
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/hex_editor 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/dunaevai135/flipper-zero-hex_editor main /
 https://github.com/dunaevai135/flipper-zero-hex_editor main /

+ 1 - 1
hex_viewer/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/hex_viewer
+https://github.com/xMasterX/all-the-plugins dev base_pack/hex_viewer 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/QtRoS/flipper-zero-hex-viewer master /
 https://github.com/QtRoS/flipper-zero-hex-viewer master /

+ 1 - 1
i2ctools/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/flipper_i2ctools
+https://github.com/xMasterX/all-the-plugins dev base_pack/flipper_i2ctools 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/NaejEL/flipperzero-i2ctools main /
 https://github.com/NaejEL/flipperzero-i2ctools main /

+ 2 - 2
ifttt/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/ifttt
-https://github.com/Ferrazzi/FlipperZero_IFTTT_Virtual_Button main FlipperZero-IFTTT_app
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/ifttt 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/Ferrazzi/FlipperZero_IFTTT_Virtual_Button main FlipperZero-IFTTT_app 4299c38c9776d4ae4e93fa5f7d0b5638855c0518

+ 1 - 1
ir_intervalometer/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/ir_intervalometer
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/ir_intervalometer 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/Nitepone/flipper-intervalometer main /
 https://github.com/Nitepone/flipper-intervalometer main /

+ 1 - 1
ir_remote/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/ir_remote
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/ir_remote 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
ir_scope/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/ir_scope
+https://github.com/xMasterX/all-the-plugins dev base_pack/ir_scope 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
jetpack_joyride/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/jetpack_joyride
+https://github.com/xMasterX/all-the-plugins dev base_pack/jetpack_joyride 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/timstrasser/flipper-jetpack-game master /
 https://github.com/timstrasser/flipper-jetpack-game master /

+ 1 - 1
key_copier/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/key_copier
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/key_copier 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/zinongli/KeyCopier main /
 https://github.com/zinongli/KeyCopier main /

+ 2 - 2
lightmeter/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/lightmeter
-https://github.com/oleksiikutuzov/flipperzero-lightmeter main application
+https://github.com/xMasterX/all-the-plugins dev base_pack/lightmeter 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/oleksiikutuzov/flipperzero-lightmeter main application 13b958b07eb21813680bca39923151364f035daf

+ 1 - 1
magspoof/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/magspoof_flipper
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/magspoof_flipper 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/zacharyweiss/magspoof_flipper main /
 https://github.com/zacharyweiss/magspoof_flipper main /

+ 1 - 1
malveke_gb_cartridge/.gitsubtree

@@ -1 +1 @@
-https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_cartridge
+https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_cartridge 3e3a4aacbf3fffc741957a2a8bb19e4b9917966c

+ 1 - 1
malveke_gb_emulator/.gitsubtree

@@ -1 +1 @@
-https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_emulator
+https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_emulator 3e3a4aacbf3fffc741957a2a8bb19e4b9917966c

+ 1 - 1
malveke_gb_link_camera/.gitsubtree

@@ -1 +1 @@
-https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_link_camera
+https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_link_camera 3e3a4aacbf3fffc741957a2a8bb19e4b9917966c

+ 1 - 1
malveke_gb_live_camera/.gitsubtree

@@ -1 +1 @@
-https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_live_camera
+https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_live_camera 3e3a4aacbf3fffc741957a2a8bb19e4b9917966c

+ 1 - 1
malveke_gb_photo/.gitsubtree

@@ -1 +1 @@
-https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_photo
+https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gb_photo 3e3a4aacbf3fffc741957a2a8bb19e4b9917966c

+ 1 - 1
malveke_gba_cartridge/.gitsubtree

@@ -1 +1 @@
-https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gba_cartridge
+https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_gba_cartridge 3e3a4aacbf3fffc741957a2a8bb19e4b9917966c

+ 1 - 1
malveke_pin_test/.gitsubtree

@@ -1 +1 @@
-https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_pin_test
+https://github.com/EstebanFuentealba/MALVEKE-Flipper-Zero main flipper_companion_apps/applications/external/malveke_pin_test 3e3a4aacbf3fffc741957a2a8bb19e4b9917966c

+ 2 - 2
mass_storage/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/mass_storage
-https://github.com/flipperdevices/flipperzero-good-faps dev mass_storage
+https://github.com/xMasterX/all-the-plugins dev base_pack/mass_storage 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/flipperdevices/flipperzero-good-faps dev mass_storage b791dea234f855155027bb46215dc60f3ddeb243

+ 1 - 1
mayhem_camera/.gitsubtree

@@ -1 +1 @@
-https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_camera
+https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_camera 8c1ca3e94da8a8a954d4798051e1e13ac9abaab8

+ 1 - 1
mayhem_marauder/.gitsubtree

@@ -1 +1 @@
-https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_marauder_companion
+https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_marauder_companion 8c1ca3e94da8a8a954d4798051e1e13ac9abaab8

+ 1 - 1
mayhem_morseflash/.gitsubtree

@@ -1 +1 @@
-https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_morseflasher
+https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_morseflasher 8c1ca3e94da8a8a954d4798051e1e13ac9abaab8

+ 1 - 1
mayhem_motion/.gitsubtree

@@ -1 +1 @@
-https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_motion_detection
+https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_motion_detection 8c1ca3e94da8a8a954d4798051e1e13ac9abaab8

+ 1 - 1
mayhem_nannycam/.gitsubtree

@@ -1 +1 @@
-https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_nannycam
+https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_nannycam 8c1ca3e94da8a8a954d4798051e1e13ac9abaab8

+ 1 - 1
mayhem_qrcode/.gitsubtree

@@ -1 +1 @@
-https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_qrcode
+https://github.com/eried/flipperzero-mayhem next flipper_companion_apps/applications/external/esp32cam_qrcode 8c1ca3e94da8a8a954d4798051e1e13ac9abaab8

+ 1 - 1
meal_pager/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/meal_pager
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/meal_pager 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/leedave/flipper-zero-meal-pager main /
 https://github.com/leedave/flipper-zero-meal-pager main /

+ 1 - 1
metronome/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/metronome
+https://github.com/xMasterX/all-the-plugins dev base_pack/metronome 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/ezod/flipperzero-metronome main /
 https://github.com/ezod/flipperzero-metronome main /

+ 2 - 2
mfc_editor/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/mfc_editor
-https://github.com/TollyH/flipper-apps main mfc-editor
+https://github.com/xMasterX/all-the-plugins dev base_pack/mfc_editor 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/TollyH/flipper-apps main mfc-editor 3f7d07b1655ef5277e650156846e1bd8357a2b3c

+ 3 - 3
mfkey/.gitsubtree

@@ -1,3 +1,3 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/mfkey
-https://github.com/noproto/flipperzero-good-faps dev mfkey
-https://github.com/noproto/FlipperMfkey master fap_plugin
+https://github.com/xMasterX/all-the-plugins dev base_pack/mfkey 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/noproto/flipperzero-good-faps dev mfkey 53996f31bdab19ed85bcb0726b6550a832372a54
+https://github.com/noproto/FlipperMfkey master fap_plugin 9928b2ee117f0ed6e5e202f7c06f8ce5797382fa

+ 1 - 1
mifare_fuzzer/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev apps_source_code/mifare_fuzzer
+https://github.com/xMasterX/all-the-plugins dev apps_source_code/mifare_fuzzer 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/spheeere98/mifare_fuzzer master /
 https://github.com/spheeere98/mifare_fuzzer master /

+ 1 - 1
minesweeper/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/minesweeper
+https://github.com/xMasterX/all-the-plugins dev base_pack/minesweeper 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/panki27/minesweeper master /
 https://github.com/panki27/minesweeper master /

+ 1 - 1
morse_code/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/morse_code
+https://github.com/xMasterX/all-the-plugins dev base_pack/morse_code 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/wh00hw/MorseCodeFAP master /
 https://github.com/wh00hw/MorseCodeFAP master /

+ 1 - 1
multi_converter/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/multi_converter
+https://github.com/xMasterX/all-the-plugins dev base_pack/multi_converter 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 2 - 2
music_player/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/music_player
-https://github.com/flipperdevices/flipperzero-good-faps dev music_player
+https://github.com/xMasterX/all-the-plugins dev base_pack/music_player 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/flipperdevices/flipperzero-good-faps dev music_player b791dea234f855155027bb46215dc60f3ddeb243

+ 2 - 2
nfc_magic/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/nfc_magic
-https://github.com/flipperdevices/flipperzero-good-faps dev nfc_magic
+https://github.com/xMasterX/all-the-plugins dev base_pack/nfc_magic 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/flipperdevices/flipperzero-good-faps dev nfc_magic b791dea234f855155027bb46215dc60f3ddeb243

+ 1 - 1
nfc_playlist/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nfc_playlist
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nfc_playlist 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/acegoal07/FlipperZero_NFC_Playlist main /
 https://github.com/acegoal07/FlipperZero_NFC_Playlist main /

+ 2 - 2
nfc_rfid_detector/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/nfc_rfid_detector
-https://github.com/flipperdevices/flipperzero-good-faps dev nfc_rfid_detector
+https://github.com/xMasterX/all-the-plugins dev base_pack/nfc_rfid_detector 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/flipperdevices/flipperzero-good-faps dev nfc_rfid_detector b791dea234f855155027bb46215dc60f3ddeb243

+ 1 - 1
nightstand_clock/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/FlipperNightStand_clock
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/FlipperNightStand_clock 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/nymda/FlipperNightStand main /
 https://github.com/nymda/FlipperNightStand main /

+ 1 - 1
nrf24batch/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nrf24-batch
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nrf24-batch 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/vad7/nRF24-Batch main /
 https://github.com/vad7/nRF24-Batch main /

+ 2 - 2
nrf24channelscanner/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nrf24channelscanner
-https://github.com/htotoo/NRF24ChannelScanner main NRF24ChannelScanner
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nrf24channelscanner 4558d74c9da36abc851edd96a95d18f7d5511a75
+https://github.com/htotoo/NRF24ChannelScanner main NRF24ChannelScanner e92da5db51ebbf0402d5e07b7af3a8d696817be2

+ 1 - 1
nrf24mousejacker/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/mousejacker
+https://github.com/xMasterX/all-the-plugins dev base_pack/mousejacker 4558d74c9da36abc851edd96a95d18f7d5511a75

+ 1 - 1
nrf24scan/.gitsubtree

@@ -1,2 +1,2 @@
-https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nrf24scan
+https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/nrf24scan 4558d74c9da36abc851edd96a95d18f7d5511a75
 https://github.com/vad7/nrf24scan master /
 https://github.com/vad7/nrf24scan master /

+ 1 - 1
nrf24sniff/.gitsubtree

@@ -1 +1 @@
-https://github.com/xMasterX/all-the-plugins dev base_pack/nrfsniff
+https://github.com/xMasterX/all-the-plugins dev base_pack/nrfsniff 4558d74c9da36abc851edd96a95d18f7d5511a75

Some files were not shown because too many files changed in this diff