diff --git a/.gitignore b/.gitignore
index cbd3f99..1472561 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,7 @@
-/updates_list.txt
\ No newline at end of file
+/updates_list.txt
+/apps/app_categories
+/etc/accent
+/etc/editor
+/etc/express-updates
+/etc/pi-apps-import
+/etc/theme
\ No newline at end of file
diff --git a/README.md b/README.md
index 996823f..13503de 100644
--- a/README.md
+++ b/README.md
@@ -40,6 +40,21 @@ To install LinStore, run the following command:
curl -s -L https://raw.githubusercontent.com/techguy16/LinStore/main/install | bash
```
+Install LinStore using Pi-Apps
+
+1. Open Pi-Apps
+2. Click the Settings icon
+3. Click "Import App"
+4. Paste the following URL in the box:
+```
+https://raw.githubusercontent.com/techguy16/LinStore/refs/heads/main/etc/tools/LinStore.zip
+```
+5. Click "OK"
+6. Click "Save". LinStore should now be listed in the applications list. Click on it, then click "Install".
+
+Manually install LinStore
@@ -51,6 +66,15 @@ chmod +x install
```
Uninstall LinStore
+
+```bash
+rm -irf ~/.linstore/!(installscripts)
+rm -f $HOME/.local/share/applications/LinStore.desktop $HOME/Desktop/LinStore.desktop
+```
+
](https://github.com/techguy16/LinStore)
```markdown
[
](https://github.com/techguy16/LinStore)
-```
\ No newline at end of file
+```
+
+
+## Contributing
+
+LinStore welcomes contributions, however small or big they are:
+
+* [Submit](https://github.com/techguy16/LinStore/issues/new?template=app-submission.yml) or [suggest](https://github.com/techguy16/LinStore/issues/new?template=app-request.yml) apps to be added to the app library
+* [Reporting bugs](https://github.com/techguy16/LinStore/issues/new?template=bug.yml) with LinStore
+* Or even just starring the repository!
\ No newline at end of file
diff --git a/api b/api
index 6f1dd8e..df118ec 100755
--- a/api
+++ b/api
@@ -31,8 +31,8 @@ logo() {
# Function to install an app
install_app() {
- local app_directory="$1"
- local selected_app_name="$2"
+ local app_directory="$(get_app_directory "$1")"
+ local selected_app_name="$1"
local installed_file="$HOME/.linstore/installed"
local temp_script=$(mktemp)
@@ -73,8 +73,8 @@ open_app() {
# Function to install an app
installation_script() {
- local app_directory="$1"
- local selected_app_name="$2"
+ local app_directory="$(get_app_directory "$1")"
+ local selected_app_name="$1"
local installed_file="$HOME/.linstore/installed"
if [ -e "$app_directory/install" ]; then
@@ -97,8 +97,8 @@ installation_script() {
# Function to uninstall an app
uninstall_app() {
- local app_directory="$1"
- local selected_app_name="$2"
+ local app_directory="$(get_app_directory "$1")"
+ local selected_app_name="$1"
local uninstalled_file="$HOME/.linstore/uninstalled"
local temp_script=$(mktemp)
@@ -166,6 +166,133 @@ search_apps() {
fi
}
+cache_categories() {
+ # $1 - apps dir
+ # $2 - include Pi-Apps?
+ yad --title="LinStore" \
+ --class="LinStore" \
+ --center --borders=10 \
+ --text "Generating app cache..." \
+ --no-buttons &
+
+ if [ -e "${1}/app_categories" ]; then
+ rm -f "${1}/app_categories"
+ fi
+
+ for app_dir in "${1}"/*; do
+ app_name=$(basename "${app_dir}")
+ if [ -e "${1}/$app_name/category" ]; then
+ if [ -e "$app_dir/install" ] || [ -e "$app_dir/install-$(cat ~/.linstore/architecture.txt)" ] \
+ || [ -e "$HOME/pi-apps/apps/$app_name/install-$(cat ~/.linstore/architecture.txt)" ] \
+ || [ -e "$HOME/pi-apps/apps/$app_name/install" ]; then
+ echo "$app_name|$(cat "${1}/$app_name/category")" >> "${1}/app_categories"
+ fi
+ fi
+ done
+
+ if [[ "$2" == "TRUE" ]]; then
+ if [ -e "$HOME/pi-apps/etc/categories" ]; then
+ while IFS= read -r line; do
+ app_name=$(echo "$line" | awk -F'|' '{print $1}')
+ app_dir="$HOME/pi-apps/apps/$app_name"
+ category=$(grep -r "$(echo "$line" | awk -F'|' '{print $2}')" etc/mapping | head -n1 | awk -F'|' '{print $2}')
+ if [ -e "$app_dir/install" ] || [ -e "$app_dir/install-$(cat ~/.linstore/architecture.txt)" ] \
+ || [ -e "$HOME/pi-apps/apps/$app_name/install-$(cat ~/.linstore/architecture.txt)" ] \
+ || [ -e "$HOME/pi-apps/apps/$app_name/install" ]; then
+ echo "$app_name|$category" >> "${1}/app_categories"
+ fi
+ done < "$HOME/pi-apps/etc/categories"
+ fi
+ fi
+
+ sort "${1}/app_categories" > "${1}/app_categories.tmp"
+ mv "${1}/app_categories.tmp" "${1}/app_categories"
+
+ pkill -f "yad*"
+}
+
+get_categories() {
+ cat etc/categories
+}
+
+get_apps_in_category() {
+ local category="$1"
+ grep "|$category$" etc/categories | cut -d'|' -f1
+}
+
+get_app_description() {
+ app_name="$1"
+ description_file="apps/$app_name/description"
+ if [ -e "$description_file" ]; then
+ cat "$description_file"
+ elif [ -e "$HOME/pi-apps/apps/$app_name/description" ]; then
+ cat "$HOME/pi-apps/apps/$app_name/description"
+ else
+ echo "No description available."
+ fi
+}
+get_app_creator() {
+ app_name="$1"
+ creator_file="apps/$app_name/creator"
+ if [ -e "$creator_file" ]; then
+ cat "$creator_file"
+ elif [ -e "$HOME/pi-apps/apps/$app_name/credits" ]; then
+ cat "$HOME/pi-apps/apps/$app_name/credits"
+ else
+ echo "No description available."
+ fi
+}
+get_app_website() {
+ app_name="$1"
+ website_file="apps/$app_name/website"
+ if [ -e "$website_file" ]; then
+ cat "$website_file"
+ else
+ echo "No description available."
+ fi
+}
+get_app_directory() {
+ app_name="$1"
+ if [ -d "apps/$app_name" ]; then
+ echo "apps/$app_name"
+ elif [ -d "$HOME/pi-apps/apps/$app_name" ]; then
+ echo "$HOME/pi-apps/apps/$app_name"
+ else
+ echo ""
+ fi
+}
+
+install_packages() {
+ packages="$@"
+ sudo apt update > /dev/null 2>&1
+
+ for package in $packages; do
+ if [[ "$package" == http* ]]; then
+ echo "Downloading and installing $package..."
+ wget --no-check-certificate "$package" -O /tmp/package.deb > /dev/null 2>&1
+ sudo dpkg -i /tmp/package.deb > /dev/null 2>&1
+ rm -r /tmp/package.deb
+ elif [[ "$package" == *.deb ]]; then
+ echo "Installing $package using dpkg..."
+ sudo dpkg -i "$package" > /dev/null 2>&1
+ else
+ echo "Installing $package using apt..."
+
+ sudo apt install "$package" -y > /dev/null 2>&1
+ fi
+ done
+}
+
+git_clone() {
+ if [ -z "$2" ]; then
+ local directory=$(basename "$1")
+ else
+ local directory="$2"
+ fi
+
+ git clone "$1" "$directory"
+}
+
update() {
pkill -f "yad*"
./api info "Updating LinStore..."
@@ -192,15 +319,23 @@ information() {
printf '\033[1;104;30m INFO:\033[0;104m %s \033[0m\n' "$msg" >&2
}
+export -f install_packages
+export -f error
+export -f warning
+export -f information
+export -f git_clone
+export -f get_app_directory
+export -f get_categories
+
# Main logic to handle command line arguments
if [[ $1 == "search" ]]; then
search_apps
elif [[ $1 == "install" ]]; then
- install_app "$2" "$3"
+ install_app "$2"
elif [[ $1 == "whatscript" ]]; then
- installation_script "$2" "$3"
+ installation_script "$2"
elif [[ $1 == "uninstall" ]]; then
- uninstall_app "$2" "$3"
+ uninstall_app "$2"
elif [[ $1 == "logo" ]]; then
logo
elif [[ $1 == "error" ]]; then
diff --git a/createapp b/createapp
index f1349f2..cff19e7 100755
--- a/createapp
+++ b/createapp
@@ -23,7 +23,7 @@ select_category_pane() {
--window-icon="images/logo/logo-64.png" --class="LinStore" \
--text="Choose a category\nLinStore organises apps by category, which allows users to quickly find related apps easier.\nPlease choose a category for your app:" \
--field="Category:" \
- --width="525" --height="550" --center --on-top --borders=10 --columns=1 "${category_list[@]}" \
+ --width="525" --height="550" --center --borders=10 --columns=1 "${category_list[@]}" \
--list --column="Icon:IMG" --column="Categories" --column="Description" --no-headers \
--button="Cancel!gtk-cancel":1 \
--button="Next!go-next":0 | awk -F '|' '{print $2}')
@@ -63,7 +63,7 @@ create_new_app_pane() {
--field="ARM 64-bit (aarch64):CHK" "" \
--field=":LBL" "" \
--field="Separate or combined install scripts?:CB" 'Combined (all architectures in one)!Separate' \
- --width="525" --height="550" --center --on-top --borders=10 --separator="|" \
+ --width="525" --height="550" --center --borders=10 --separator="|" \
--button="Cancel!gtk-cancel":1 \
--button="Next!go-next":0)
@@ -104,7 +104,7 @@ create_new_app_pane() {
--text="App Assets\nYour app needs assets in LinStore, which is currently limited to the app's logo/icon.\nSelect these assets here:" \
--field=":LBL" "" \
--field="Icon/logo:SFL" "" \
- --width="525" --height="550" --center --on-top --borders=10 --separator="|" \
+ --width="525" --height="550" --center --borders=10 --separator="|" \
--button="Cancel!gtk-cancel":1 \
--button="Next!go-next":0)
@@ -120,52 +120,67 @@ create_new_app_pane() {
convert "$icon_file" -resize 24x24 "$app_directory/icon-24.png"
convert "$icon_file" -resize 16x16 "$app_directory/icon-16.png"
fi
-
+
+ # Create or update the install scripts based on user preferences
+ if [[ "$separate_scripts" == "Combined (all architectures in one)" ]]; then
+ touch "$app_directory/install" &
+ else
+ if [ "$install_x64" == "TRUE" ]; then
+ touch "$app_directory/install-x64" &
+ fi
+ if [ "$install_x86" == "TRUE" ]; then
+ touch "$app_directory/install-x86" &
+ fi
+ if [ "$install_32" == "TRUE" ]; then
+ touch "$app_directory/install-32" &
+ fi
+ if [ "$install_64" == "TRUE" ]; then
+ touch "$app_directory/install-64" &
+ fi
+ fi
+
+ touch "$app_directory/uninstall" &
+
+ edit_scripts_pane "$app_directory"
+}
+
+edit_scripts_pane() {
+ app_directory="$1"
+ editor=$(get_editor)
+ buttons=()
+ for file in "$app_directory"/*; do
+ [ -f "$file" ] || continue
+ if [[ "$(basename "$file")" == "install"* ]]; then
+ buttons+=("--field= $(basename "$file")!images/button/install.png:BTN" "$editor \"$file\"")
+ elif [[ "$(basename "$file")" == "uninstall"* ]]; then
+ buttons+=("--field= $(basename "$file")!images/button/uninstall.png:BTN" "$editor \"$file\"")
+ fi
+ done
+
yad --form \
--title="Create New App" \
--image="images/logo/logo-64.png" --image-on-top \
--window-icon="images/logo/logo-64.png" --class="LinStore" \
- --text="Installer Scripts\nYour app has been created!" \
+ --text="Edit App Scripts\nEdit your app's install and uninstall scripts." \
--field=":LBL" "" \
- --field="You now need to write an Installer and an Uninstaller script. These are the scripts executed when users click \"Install\" and \"Uninstall\" in LinStore.\n\nIf you would like to create these now, press 'Next'. Else, press 'Cancel'.:LBL" "" \
- --width="525" --height="550" --center --on-top --borders=10 --separator="|" \
+ --field="Listed below are the scripts used by LinStore when installing or uninstalling your app. Click on one to create or edit it.:LBL" "" \
+ "${buttons[@]}" \
+ --width="525" --height="550" --center --borders=10 --separator="|" \
--button="Cancel!gtk-cancel":1 \
- --button="Next!go-next":0 > /dev/null 2>&1
+ --button="Next!go-next":0 > /dev/null 2>&1
- # Create or update the install scripts based on user preferences
if [ $? -eq 0 ]; then
- if [[ "$separate_scripts" == "Combined (all architectures in one)" ]]; then
- gedit "$app_directory/install" &
- else
- if [ "$install_x64" == "TRUE" ]; then
- gedit "$app_directory/install-x64" &
- fi
- if [ "$install_x86" == "TRUE" ]; then
- gedit "$app_directory/install-x86" &
- fi
- if [ "$install_32" == "TRUE" ]; then
- gedit "$app_directory/install-32" &
- fi
- if [ "$install_64" == "TRUE" ]; then
- gedit "$app_directory/install-64" &
- fi
- fi
-
- gedit "$app_directory/uninstall"
- wait
- elif [ $? -eq 252 ]; then
- echo $?
+ yad --form \
+ --title="Create New App" \
+ --image="images/logo/logo-64.png" --image-on-top \
+ --window-icon="images/logo/logo-64.png" --class="LinStore" \
+ --text="Thank you!\nThank you for using LinStore's app creation wizard." \
+ --field=":LBL" "" \
+ --field="Next Steps:\nSubmit your app for addition to LinStore's app library. You can do this by 'zipping' the new app's directory and uploading it to an issue at our GitHub.\n\nIf you do not wish to do so, you can still distribute your app's zip file by specifying to your users to use LinStore's 'Import App' function.:LBL" "" \
+ --width="525" --height="550" --center --borders=10 --separator="|" \
+ --button="Exit!window-close":0 > /dev/null 2>&1
fi
-
- yad --form \
- --title="Create New App" \
- --image="images/logo/logo-64.png" --image-on-top \
- --window-icon="images/logo/logo-64.png" --class="LinStore" \
- --text="Thank you!\nThank you for using LinStore's app creation wizard." \
- --field=":LBL" "" \
- --field="Next Steps:\nSubmit your app for addition to LinStore's app library. You can do this by 'zipping' the new app's directory and uploading it to an issue at our GitHub.\n\nIf you do not wish to do so, you can still distribute your app's zip file by specifying to your users to use LinStore's 'Import App' function.:LBL" "" \
- --width="525" --height="550" --center --on-top --borders=10 --separator="|" \
- --button="Exit!window-close":0 > /dev/null 2>&1
+
}
welcome() {
@@ -176,7 +191,7 @@ welcome() {
--text="App Creator\nWelcome to the LinStore's app creator!" \
--field=":LBL" "" \
--field="What is this?\nThis is a wizard that will guide you through the necessary steps in order to create an app to be displayed in LinStore.\n\nIf you're ready, press 'Next'.\nIf you got here by accident, press 'Cancel'.:LBL" "" \
- --width="525" --height="550" --center --on-top --borders=10 --separator="|" \
+ --width="525" --height="550" --center --borders=10 --separator="|" \
--button="Cancel!gtk-cancel":1 \
--button="Next!go-next":0 > /dev/null 2>&1
if [ $? -eq 0 ]; then
@@ -196,7 +211,7 @@ import_zip_file() {
--field=":LBL" "" \
--field="Some app developers distribute ZIP files to let you import into LinStore.\n\nTo import such a ZIP file, select it below and we'll import it for you.:LBL" "" \
--field="ZIP File: :SFL" "" \
- --width="525" --height="550" --center --on-top --borders=10 --separator="|" \
+ --width="525" --height="550" --center --borders=10 --separator="|" \
--button="Cancel!gtk-cancel":1 \
--button="Next!go-next":0 | awk -F '|' '{print $3}')
diff --git a/etc/tools/LinStore.zip b/etc/tools/LinStore.zip
new file mode 100644
index 0000000..d572adf
Binary files /dev/null and b/etc/tools/LinStore.zip differ
diff --git a/gui b/gui
index 87bc285..68229d7 100755
--- a/gui
+++ b/gui
@@ -1,5 +1,7 @@
#!/bin/bash
+source api
+
APP_STORE_NAME="LinStore"
APP_STORE_WIDTH=320
APP_STORE_HEIGHT=600
@@ -9,6 +11,12 @@ YAD_COMMAND="yad"
YAD_FLAGS=""
ACCENT="green"
+export ACCENT
+
+pipe="$(mktemp -u)"
+mkfifo $pipe
+export pipe
+trap "rm -f $pipe" EXIT
#pwd
if ! command -v "$YAD_COMMAND" &>/dev/null; then
@@ -74,98 +82,6 @@ list_piapps() {
fi
}
-read_categories() {
- while read -r category; do
- categories["$category"]=""
- done